检测PowerShell脚本执行时出错

时间:2012-11-18 17:40:23

标签: powershell batch-file

我有一个 PowerShell 脚本:

...
Any-Command -ErrorCode Stop
...

然后我从 bat 脚本调用此脚本:

...
powershell myscript.ps1
...

现在我想在 bat 脚本中知道,如果被调用的 PowerShell 脚本在出错时停止并且没有到达脚本的末尾。怎么做?

2 个答案:

答案 0 :(得分:4)

一种方法是在脚本中添加顶级陷阱语句,如:

trap {
   exit 1; # or whatever error code
}

注意:陷阱可能被认为是老式的(尽管我喜欢顶级),另一种选择是尝试 - 最终围绕整个脚本。

因此,当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)来确保根主机也退出。

答案 1 :(得分:0)

只是添加了Marcus给出的答案

我注意到陷阱代码甚至隐藏了实际错误。在我的情况下,我需要发生实际的错误。只需添加修改后的代码即可完成。

 trap 
    { 
        write-error $("Error: " + $_.Exception.Message); 
        exit 1; # or whatever error code 
    } 

http://huddledmasses.org/trap-exception-in-powershell/

的更多信息