Почему мои сценарии PowerShell не работают?

Я написал простой командный файл в виде сценария PowerShell, и при его запуске возникают ошибки.

Он находится в каталоге сценариев на моем пути. Это ошибка, которую я получаю:

Не может быть загружен, потому что выполнение сценариев отключено в этой системе. См. "Получить справку о подписании".

Я заглянул в справку, но она мне не помогла.

Ответов (10)

Решение

Это может быть уровень безопасности PowerShell по умолчанию, который (IIRC) будет запускать только подписанные скрипты.

Попробуйте ввести это:

set-executionpolicy remotesigned

Это укажет PowerShell разрешить выполнение локальных (то есть на локальном диске) неподписанных сценариев.

Затем попробуйте снова выполнить свой сценарий.

Команда set-executionpolicy unrestricted позволит запускать любой созданный вами сценарий от имени вошедшего в систему пользователя. Просто не забудьте установить для параметра «Executionpolicy» значение «подписано» с помощью set-executionpolicy signed команды перед выходом из системы.

Использовать:

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Всегда используйте указанную выше команду, чтобы разрешить выполнение PowerShell в текущем сеансе.

Вам нужно запустить Set-ExecutionPolicy :

Set-ExecutionPolicy Restricted <-- Will not allow any powershell scripts to run.  Only individual commands may be run.

Set-ExecutionPolicy AllSigned <-- Will allow signed powershell scripts to run.

Set-ExecutionPolicy RemoteSigned <-- Allows unsigned local script and signed remote powershell scripts to run.

Set-ExecutionPolicy Unrestricted <-- Will allow unsigned powershell scripts to run.  Warns before running downloaded scripts.

Set-ExecutionPolicy Bypass <-- Nothing is blocked and there are no warnings or prompts.
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

Вышеупомянутая команда работала у меня, даже когда произошла следующая ошибка:

Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied.

Мне удалось обойти эту ошибку, вызвав PowerShell следующим образом:

powershell -executionpolicy bypass -File .\MYSCRIPT.ps1

То есть я добавил -executionpolicy bypass к способу вызова сценария.

Это работало с пакетом обновления 1 для Windows 7. Я новичок в PowerShell, поэтому могут быть предостережения, о которых я не знаю.

[Edit 2017-06-26] Я без проблем продолжал использовать эту технику в других системах, включая Windows 10 и Windows 2012 R2.

Вот что я сейчас использую. Это предохраняет меня от случайного запуска скрипта, щелкнув по нему. Когда я запускаю его в планировщике, я добавляю один аргумент: «планировщик», и это обходит подсказку.

Это также приостанавливает окно в конце, чтобы я мог видеть вывод PowerShell.

if NOT "%1" == "scheduler" (
   @echo looks like you started the script by clicking on it.
   @echo press space to continue or control C to exit.
   pause
)

C:
cd \Scripts

powershell -executionpolicy bypass -File .\rundps.ps1

set psexitcode=%errorlevel%

if NOT "%1" == "scheduler" (
   @echo Powershell finished.  Press space to exit.
   pause
)

exit /b %psexitcode%

Было бы идеально обойти политики выполнения, например, через

powershell -executionpolicy bypass -File .\MYSCRIPT.ps1

К сожалению, этого все еще можно избежать с помощью групповых политик. В качестве обходного пути вы можете закодировать свой скрипт как Base64, запустив его в PowerShell:

[Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes((Get-Content .\MYSCRIPT.ps1)))

Затем выполните такой результат:

powershell.exe -EncodedCommand "put-your-base64-string-here"

Предостережение: это не будет работать со скриптами, требующими параметров.

В Windows 10: щелкните изменить свойство безопасности myfile.ps1 и измените «разрешить доступ», щелкнув правой кнопкой мыши / свойства на myfile.ps1.

Мы можем обойти политику выполнения красивым способом (внутри командной строки):

type file.ps1 | powershell -command -

Или внутри powershell:

gc file.ps1|powershell -c -

Также стоит знать, что вам может потребоваться включить .\ перед именем скрипта. Например:

.\scriptname.ps1