Выполнение сценариев отключено в этой системе: как исправить в PowerShell

опубликовано
читать
≈ 4 мин
автор
среда и версия
Windows 11 24H2 (сборка 26100) с русским интерфейсом, Windows PowerShell 5.1
содержание решать задачи Python для начинающих

«Невозможно загрузить файл …, так как выполнение сценариев отключено в этой системе» — так PowerShell отказывается запускать файл .ps1. Чаще всего это скрипт активации виртуального окружения Python .venv\Scripts\Activate.ps1 или npm.ps1 в терминале VS Code. В Windows 11 запуск сценариев PowerShell по умолчанию запрещён политикой выполнения Restricted. Это не вирус и не поломка: команды по одной вводить можно, а файлы-сценарии — нельзя.

Исправление — одна команда, которая разрешает твои собственные скрипты только твоей учётной записи. Ниже разобрано, что именно она меняет, как обойтись без неё и что делать со скачанными скриптами. Вывод снят на Windows 11 24H2 с русским интерфейсом.

Python / 01

Какая политика выполнения действует

Какая политика выполнения действуетPowerShell просматривает пять областей сверху вниз — MachinePolicy, UserPolicy, Process, CurrentUser, LocalMachine — и берёт первое заданное значение. По умолчанию все пять Undefined, поэтому действует Restricted и скрипты .ps1 не запускаются. После Set-ExecutionPolicy -Scope CurrentUser RemoteSigned в области CurrentUser стоит RemoteSigned: свои скрипты запускаются, а скачанные — только с подписью или после Unblock-File.области сверху вниз — действует первое заданное значениеобластьпо умолчаниюпосле командыMachinePolicyUndefinedUndefinedUserPolicyUndefinedUndefinedProcessUndefinedUndefinedCurrentUserUndefinedRemoteSignedLocalMachineUndefinedUndefinedдействуетRestricted.ps1 не запускаютсяRemoteSignedсвои .ps1 запускаются
Если ни в одной области политика не задана, Windows 11 применяет Restricted. Команда для CurrentUser меняет одну строку — и только для твоей учётной записи.

Как выглядит ошибка

Файл hello.ps1 из папки C:\tools в чистой Windows 11 не запускается:

.\hello.ps1
.\hello.ps1 : Невозможно загрузить файл C:\tools\hello.ps1, так как выполнение сценариев отключено в этой системе. Для получения дополнительных сведений см. about_Execution_Policies по адресу https:/go.microsoft.com/fwlink/?LinkID=135170.
    + CategoryInfo          : Ошибка безопасности: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

В окне PowerShell сообщение переносится по ширине окна, а между первой строкой и CategoryInfo стоит строка с позицией. С виртуальным окружением Python текст тот же, только путь другой — к .venv\Scripts\Activate.ps1.

Почему так: политика выполнения

Какие скрипты разрешено запускать, решает политика выполнения. Текущую показывает Get-ExecutionPolicy, а значения по всем областям — ключ -List:

Get-ExecutionPolicy
Get-ExecutionPolicy -List
Restricted

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined

Ни в одной области политика не задана, и Windows 11 применяет значение по умолчанию — Restricted: отдельные команды выполняются, файлы .ps1 нет. Области проверяются сверху вниз, и побеждает первое заданное значение. MachinePolicy и UserPolicy задаёт администратор через групповые политики, и их не перебить командой.

Как исправить: RemoteSigned для себя

Разреши запуск скриптов только своей учётной записи:

Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
Get-ExecutionPolicy -List
        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser    RemoteSigned
 LocalMachine       Undefined

Если PowerShell попросит подтвердить изменение, согласись. Права администратора не нужны: меняется только область CurrentUser. Именно эту команду для Activate.ps1 приводит документация Python. Теперь скрипт запускается:

.\hello.ps1
hello from hello.ps1

RemoteSigned значит: свои скрипты запускаются как есть, а скачанные из интернета — только с цифровой подписью.

Только на один раз: Bypass для текущего окна

Если менять настройку не хочется, разреши скрипты лишь в текущем окне PowerShell — до его закрытия:

Set-ExecutionPolicy -Scope Process Bypass

Тот же эффект даёт запуск отдельного процесса powershell -ExecutionPolicy Bypass. При следующем открытии терминала снова будет Restricted.

Скачанный скрипт: не имеет цифровой подписи

Windows помечает файлы, скачанные из интернета. При RemoteSigned такой скрипт без подписи по-прежнему не запустится, но сообщение будет другим:

.\downloaded.ps1 : Не удается загрузить файл C:\tools\downloaded.ps1. Файл C:\tools\downloaded.ps1 не имеет цифровой подписи. Невозможно выполнить сценарий в указанной системе. Для получения дополнительных сведений о выполнении сценариев и настройке политики выполнения см. about_Execution_Policies по адресу https:/go.microsoft.com/fwlink/?LinkID=135170.

Если ты доверяешь источнику, сними пометку — и скрипт запустится:

Unblock-File .\downloaded.ps1
.\downloaded.ps1
hello from hello.ps1

Без PowerShell-скриптов вовсе

Активировать виртуальное окружение можно и без Activate.ps1:

  • в командной строке (cmd) — .venv\Scripts\activate.bat, политика выполнения на неё не действует;
  • в любой оболочке — сразу через Python окружения: .venv\Scripts\python.exe main.py и .venv\Scripts\python.exe -m pip install requests. Подробнее — в статье о виртуальном окружении.

С npm то же самое: в PowerShell команда npm запускает скрипт npm.ps1 из папки Node.js, а npm.cmd — обычный командный файл, на который политика не распространяется.

Ошибки, на которых спотыкаются

Set-ExecutionPolicy Unrestricted без области. Без -Scope команда меняет LocalMachine — для всех пользователей, и требует прав администратора. А Unrestricted разрешает и скачанные скрипты без подписи. Для учёбы и разработки достаточно RemoteSigned для CurrentUser.

Политика не меняется, хотя команда прошла. Значит, она задана в MachinePolicy или UserPolicy — групповой политикой, как на рабочих и школьных компьютерах. Это видно в Get-ExecutionPolicy -List. Здесь помогают способы без .ps1: activate.bat или Python окружения напрямую.

Терминал VS Code открыт со старыми настройками. После смены политики открой новый терминал — уже открытый ничего не узнает.

Частые вопросы

Безопасно ли включать RemoteSigned

Для своей учётной записи — да, это разумный режим для разработки: свои и проверенные скрипты работают, а скачанные без подписи — нет, пока ты сам не снимешь с них пометку.

Чем это отличается от «не распознано как имя командлета»

Там PowerShell не нашёл программу вовсе, а здесь нашёл скрипт, но ему запрещено его запускать. Разбор первой ошибки — в статье «Не является внутренней или внешней командой».

Источники

Выжимки статей в Telegram: одна ловушка, код с выводом и ссылка на полный разбор. t.me/koddo_ru