如何停止第一个错误的PowerShell脚本?

我希望我的PowerShell脚本停止,当我运行的任何命令失败(如在bash set -e )。 我使用两个Powershell命令( New-Object System.Net.WebClient )和程序( .\setup.exe )。

$ErrorActionPreference = "Stop"会让你在那里的一部分(即这对cmdlet很好)。

但是对于EXE,在每次exe调用之后,您将需要自己检查$LastExitCode ,并确定是否失败。 不幸的是,我不认为PowerShell可以在这里提供帮助,因为在Windows上,EXE在“成功”或“失败”退出代码的构成方面并不十分一致。 大多数遵循0表示成功的UNIX标准,但不是全部都是。 查看这篇博文中的CheckLastExitCode函数 。 你可能会觉得它很有用。

您应该可以通过在脚本开始处使用语句$ErrorActionPreference = "Stop"来完成此操作。

$ErrorActionPreference的默认设置是Continue ,这就是为什么你看到你的脚本继续发生错误。

不幸的是, 由于像New-RegKey和Clear-Disk这样的错误的cmdlet ,这些答案都不够。 目前我已经在任何PowerShell脚本的顶部定位以保持我的理智。

 Set-StrictMode -Version Latest $ErrorActionPreference = "Stop" $PSDefaultParameterValues['*:ErrorAction']='Stop' 

然后任何本地电话获得这种待遇:

 native_call.exe $native_call_success = $? if (-not $native_call_success) { throw 'error making native call' } 

原生的调用模式对我来说已经慢慢变得普遍了,所以我应该考虑使它更加简洁的选项。 我仍然是一个powershell新手,所以build议是值得欢迎的。

我来到这里寻找同样的事情。 $ ErrorActionPreference =“Stop”立即杀死我的shell时,我宁愿看到错误信息(暂停),然后才终止。 回到我的批次敏感度:

 IF %ERRORLEVEL% NEQ 0 pause & GOTO EOF 

我发现这对我的特定ps1脚本非常相似:

 Import-PSSession $Session If ($? -ne "True") {Pause; Exit}