我编写了一个简单的批处理文件作为 PowerShell 脚本,运行时出现错误。
它位于我路径中的脚本目录中。这是我得到的错误:
无法加载,因为在此系统上禁用了脚本的执行。请参阅“获取有关签名的帮助”。
我查看了帮助,但它没有帮助。
我编写了一个简单的批处理文件作为 PowerShell 脚本,运行时出现错误。
它位于我路径中的脚本目录中。这是我得到的错误:
无法加载,因为在此系统上禁用了脚本的执行。请参阅“获取有关签名的帮助”。
我查看了帮助,但它没有帮助。
它可能是 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.
采用:
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
始终使用上述命令启用在当前会话中执行 PowerShell。
我可以通过像这样调用 PowerShell 来绕过这个错误:
powershell -executionpolicy bypass -File .\MYSCRIPT.ps1
也就是说,我在-executionpolicy bypass
调用脚本的方式中添加了 。
这适用于 Windows 7 Service Pack 1。我是 PowerShell 新手,因此可能会有一些我不知道的警告。
[编辑 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%
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
即使发生以下错误,上述命令也对我有用:
Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied.
另外值得知道的是,您可能需要.\
在脚本名称前面包含。例如:
.\scriptname.ps1
该命令set-executionpolicy unrestricted
将允许您创建的任何脚本以登录用户身份运行。set-executionpolicy signed
只需确保在注销之前使用命令将执行策略设置回签名。
我们可以很好地绕过执行策略(在命令提示符内):
type file.ps1 | powershell -command -
或者在powershell里面:
gc file.ps1|powershell -c -
在 Windows 10 上:单击更改 myfile.ps1 的安全属性并通过右键单击 myfile.ps1 上的 / 属性更改“允许访问”
绕过执行策略是理想的,例如通过
powershell -executionpolicy bypass -File .\MYSCRIPT.ps1
不幸的是,这仍然可以通过组策略来防止。作为一种解决方法,您可以通过在 PowerShell 中运行将脚本编码为 Base64:
[Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes((Get-Content .\MYSCRIPT.ps1)))
然后像这样执行结果:
powershell.exe -EncodedCommand "put-your-base64-string-here"
警告:这不适用于需要参数的脚本。