如何让 Powershell 表现得像带有标志的 Bashset -e
? set -o errexit
创建一个 Bash 脚本“如果简单命令以非零状态退出,则立即退出”。
我想我可以通过设置来做到这一点$ErrorActionPreference="Stop"
但这似乎不起作用。假设我有一个脚本a.ps1
$ErrorActionPreference="Stop"
& cmd /c "exit 1"
echo "cmd exited `$LastExitCode=$LastExitCode and `$?=$?"
如果我运行它
.\a. ; echo "a.ps1 exited `$LastExitCode=$LastExitCode `$?=$?"
令我惊讶的是它打印了
cmd exited $LastExitCode=1 and $?=False
a.ps1 exited $LastExitCode=1 $?=True
这是怎么回事?!我预计 a.ps1 在第一行之后退出,抛出错误并设置 $?为假。
有没有官方文档解释 $ErrorActionPreference?我发现的只是这个帖子 http://blogs.technet.com/b/heyscriptingguy/archive/2010/03/08/hey-scripting-guy-march-8-2010.aspx在关于咖啡的博客上。
$ErrorActionPreference
可以按预期工作,只是本机程序的退出代码的行为不如 PowerShell cmdlet 好。
For a cmdlet
错误情况很容易确定:异常是否发生?所以下面的内容不会到达Write-Host
声明与$ErrorActionPreference
set to Stop
:
Write-Error blah
or
Get-ChildItem somepathwhichsurelydoesntexisthere
对于本机程序,退出代码为零usually表示没有发生错误,但这只是一种约定,非零退出代码表示错误。你会说如果choice
退出代码为 1 是否存在,表明这是一个错误?
处理此问题的唯一可靠方法是在运行本机命令后检查退出代码并自行处理(如果需要)。 PowerShell 不会尝试猜测结果的含义,因为在这种情况下,约定不够强大,无法保证默认行为。
如果你想让你的生活更轻松,你可以使用一个函数:
function Invoke-NativeCommand {
$command = $args[0]
$arguments = $args[1..($args.Length)]
& $command @arguments
if ($LastExitCode -ne 0) {
Write-Error "Exit code $LastExitCode while running $command $arguments"
}
}
但一般来说,许多程序需要不同的处理,因为它们不遵守上述约定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)