Почему мои сценарии PowerShell не работают?
Я написал простой командный файл в виде сценария PowerShell, и при его запуске возникают ошибки.
Он находится в каталоге сценариев на моем пути. Это ошибка, которую я получаю:
Не может быть загружен, потому что выполнение сценариев отключено в этой системе. См. "Получить справку о подписании".
Я заглянул в справку, но она мне не помогла.
Ответов (10)10
Это может быть уровень безопасности PowerShell по умолчанию, который (IIRC) будет запускать только подписанные скрипты.
Попробуйте ввести это:
set-executionpolicy remotesigned
Это укажет 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.
Мне удалось обойти эту ошибку, вызвав 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"
Предостережение: это не будет работать со скриптами, требующими параметров.