调用 Set-ExecutionPolicy 时如何抑制来自脚本的警告消息

Posted

技术标签:

【中文标题】调用 Set-ExecutionPolicy 时如何抑制来自脚本的警告消息【英文标题】:How to suppress warning message from script when calling Set-ExecutionPolicy 【发布时间】:2020-03-05 09:07:13 【问题描述】:

我正在编写一个脚本,以便在使用之前准备好我们的笔记本电脑。它本质上是安装证书并将执行策略设置为 AllSigned。

它通过鼠标右键单击和“使用 Powershell 运行”来执行。这是对执行策略的 Windows 10 标准绕过,让脚本在未修改的 Windows 10 机器上运行(至少在我看来是这样)。所以我可以执行我的脚本,而无需显式更改执行策略。 脚本运行后,机器就设置好了。我只是收到一个我想压制的警告。

为了在脚本中执行此操作,我使用绕过参数将脚本提升为管理员权限。除了我在设置 AllSigned 执行策略时收到警告之外,这一切正常。它说我有一个在更具体的范围内定义的策略。

注意:该命令有效并且已设置执行策略。它只是弹出红色,看起来像一个错误。如果其他人执行脚本,我不想弹出问题。

--我的问题:-- 据我所知,这种行为是有意的,我不希望出现警告。我怎样才能抑制消息?

我尝试使用“WarningAction”和“ErrorAction”开关进行各种设置,但都不起作用。

一些细节: 错误消息:

Set-ExecutionPolicy:Windows PowerShell 更新了您的执行策略 成功,但该设置被在 更具体的范围。由于覆盖,您的外壳将保留其 Bypass 当前有效的执行策略。类型 “Get-ExecutionPolicy -List”查看您的执行策略设置。 有关详细信息,请参阅“Get-Help Set-ExecutionPolicy”。在 C:\Users\uwe\Desktop\InstallRootCA\InstallRootCertificate.ps1:46 字符:5 + Set-ExecutionPolicy AllSigned -Scope LocalMachine -Force + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~ + CategoryInfo : PermissionDenied: (:) [Set-ExecutionPolicy], SecurityException + FullyQualifiedErrorId : ExecutionPolicyOverride,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand

powershell 脚本中的相关代码部分:

在执行之前提升脚本:

 if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) 
     Start-Process PowerShell -Verb RunAs "-NoProfile -ExecutionPolicy Bypass -Command `"cd '$pwd'; & '$PSCommandPath';`"";
     exit;
 

在脚本末尾设置执行策略:

Set-ExecutionPolicy AllSigned -Scope LocalMachine

我尝试了各种标志

-Force
-WarningAction Ignore|SilentlyContinue
-ErrorAction same

但还是会弹出红色警告。

【问题讨论】:

错误告诉你 PermissionDenied ,对我来说命令 -force 工作良好,没有任何弹出窗口。 PS 以管理员身份运行。 它以管理员身份运行。提升代码以管理员身份重新启动脚本。但这就是问题所在。由于绕过该策略,它会创建一个警告。代码运行良好。 我尝试使用参数-force 设置每项政策,但没有人显示警告、弹出窗口或其他内容。 只有当你先用提升代码编写脚本并在脚本中设置执行策略时才会出现警告。而 LocalMachine 策略在开始之前设置为 Restricted。 【参考方案1】:

您可以将此命令放入 try catch 语句中。 catch 语句将处理错误,如果它是空的,如果Set-ExecutionPolicy 抛出错误,则不会发生任何事情。

try
    Set-ExecutionPolicy AllSigned -Scope LocalMachine

catch 
    #Do Nothing

请测试一下,让我知道它是否有效,如果有效,请将帖子标记为答案:)

【讨论】:

这行得通。没想到,因为我认为 ErrorAction 会处理这个问题。 感谢您的快速反馈。我很高兴它奏效了。顺便提一句。我不知道为什么 ErrorAction 不能解决问题。 @Nicicalu, -ErrorAction 仅对 non-terminating 错误起作用,而手头的错误是 terminating 错误(即使它应该不是)。【参考方案2】:

Nicicalu's answer有效;让我补充一些背景信息:

Set-ExecutionPolicy 在您的情况下发出的是(语句-)终止错误,这就是为什么它既不受-ErrorAction 也不受-WarningAction.

终止错误只能通过处理:

try / catch,如 Nicicalu 的回答所示。

-很少使用-trap声明

令人困惑的是,偏好变量 $ErrorActionPreference 设置为'SilentlyContinue'

这令人困惑,因为看似等效的-ErrorAction 通用参数不起作用;也就是说,-ErrorAction SilentlyContinue-ErrorAction Ignore 具有no 效果,因为-ErrorAction 设计为仅对非终止错误进行操作。

如需全面了解 PowerShell 的复杂错误处理,请参阅this GitHub docs issue。


退一步:Set-ExecutionPolicy 在这种情况下报告错误是没有意义的,因为命令仍然成功 原则上。

如this GitHub issue 中所建议,发出警告 会更合适。

【讨论】:

以上是关于调用 Set-ExecutionPolicy 时如何抑制来自脚本的警告消息的主要内容,如果未能解决你的问题,请参考以下文章

从套接字读取时如何处理阻塞的 read() 调用?

调用 REST API 时如何处理 Google Ads API 速率限制?

单元测试时如何处理 API 调用速率限制?

运行 Mongoose 时执行 ajax 调用时如何处理 Node.js 发现

使用 WCF 和 DefaultCredentials 时如何处理密码更改?

调试时如何处理 ClassNotLoadedException?