我有一个PowerShell脚本:
...
Any-Command -ErrorCode Stop
...
然后我从一个bat脚本调用这个脚本:
...
powershell myscript.ps1
...
现在我想在bat脚本中知道调用的PowerShell脚本是否因错误而停止并且没有到达脚本的末尾。怎么做?
我有一个PowerShell脚本:
...
Any-Command -ErrorCode Stop
...
然后我从一个bat脚本调用这个脚本:
...
powershell myscript.ps1
...
现在我想在bat脚本中知道调用的PowerShell脚本是否因错误而停止并且没有到达脚本的末尾。怎么做?
一种方法是在脚本中添加顶级陷阱语句,例如:
trap {
exit 1; # or whatever error code
}
注意:陷阱可能被认为是老式的(尽管我喜欢它是顶级的),另一个选项是围绕整个脚本的 try-finally。
所以当 Any-Command 出现异常退出时,会执行 trap 语句,脚本会以错误代码 1 退出。如果你不添加这个,Powershell 会以错误代码 0 退出(毕竟 Powershell 运行得很好,虽然脚本没有)。
然后,您可以使用以下内容检测 bat 脚本中的错误代码:
powershell -noprofile -noninteractive -file <<your script>>
IF ERRORLEVEL 1 (echo ERROR) ELSE (echo OK)
pause
这将检测任何 1 或更高的错误代码。
您也可以使用%ERRORLEVEL%
,但要小心,这可能会被作为环境变量覆盖。
注意:如果您在嵌套的运行空间中运行脚本,您可以考虑使用$host.SetShouldExit(1)
以确保根主机也退出。
只是添加到马库斯给出的答案
我注意到陷阱代码甚至隐藏了实际错误。就我而言,我需要发生实际错误。只需添加修改后的代码即可完成。
trap
{
write-error $("Error: " + $_.Exception.Message);
exit 1; # or whatever error code
}
更多信息请访问http://huddledmasses.org/trap-exception-in-powershell/