为什么我的 PowerShell 脚本没有运行?

我编写了一个简单的批处理文件作为 PowerShell 脚本,当它们运行时我会收到错误。

它在我路径中的脚本目录中,我得到的错误是:

无法加载,因为在此系统上禁用了脚本的执行。 请参阅“关于签名的帮助”。

我查了帮手,但没什么帮助。

218003 次浏览

它可以是 PowerShell 的默认安全级别,该级别(IIRC)将只运行签名脚本。

试着输入以下内容:

set-executionpolicy remotesigned

这将告诉 PowerShell 允许运行本地(即在本地驱动器上)无符号脚本。

然后再次执行脚本。

Also it's worth knowing that you may need to include .\ in front of the script name. For example:

.\scriptname.ps1

命令 set-executionpolicy unrestricted将允许您创建的任何脚本作为登录用户运行。只要确保在注销之前使用 set-executionpolicy signed命令将 Exectionpolicy 设置设置回已签名状态即可。

用途:

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

That is, I added the -executionpolicy bypass to the way I invoked the script.

This worked on Windows 7 Service Pack 1. I am new to PowerShell, so there could be caveats to doing that that I am not aware of.

[编辑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%

在 Windows10上: 单击 change security property of myfile.ps1,并通过在 myfile.ps1上右键单击/properties 来更改“ allow access”

我们可以很好地绕过执行策略(在命令提示符内) :

type file.ps1 | powershell -command -

或者在 Powershell 内部:

gc file.ps1|powershell -c -

理想的做法是绕过执行策略,例如

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"

Caveat: This won't work with scripts that require parameters.