我正在写一个powershell脚本,它模仿watch的行为。它工作正常,直到我看到一个抛出异常的exe。
当这种情况发生时,VisualStudio中的JIT调试器将启动并打开一个对话框。我已经尝试使用try/catch块捕获异常,如下面的代码示例所示。
我知道我可以在VS中打开调试器,但我不想打开它,因为它对调试很有用。我只是想捕捉/抑制异常和弹出时,它在这个脚本中遇到的。
我读过一些消息来源,声称这在powershell中是不可行的,但我希望他们是错误的,有一些聪明的方法来解决这个问题。有人有什么建议吗?
我尝试过的:
$tick = "-"
while ($true)
{
try {
$out = invoke-expression "$args"
}
catch {
$out = "Error: " + $_.Exception.Message
} finally {
cls
$out
$tick
if ($tick -eq "-") {$tick = "+"} else {$tick = "-"}
sleep 1
}
}
我还尝试过将[Exception]
和[System.IO.IOException]
(我收到的具体异常)添加到catch块中,但没有任何运气。
3条答案
按热度按时间xiozqbni1#
Exe使用exitcodes返回错误状态而不是.NET异常。解决方法是检查$lasterrorexitcode。如果你想使用try/catch块,你可以在lastrorcode不等于零的情况下发出一个throw语句。注意:有一件事要小心-一些exe使用非零错误代码返回错误以外的状态。
下面是一个例子:
封装try/catch块
lztngnrs2#
(可能)聪明的方法解决这个问题(前两个涉及发送击键到抛出的异常对话框,以自动消除它)
1.使用WASP powershell模块(在Codeplex上)在执行EXE后查询错误对话框的存在几秒钟,如果对话框窗口存在,则发送键将其关闭
1.使用system.diagnostics.process启动EXE,并注册3个可能事件的某种组合:Disposed、ErrorDataReceived和Exited,以区分EXE是否引发异常。
1.如果你可以将EXE作为一个程序集加载,然后执行它的Main方法,那么你就可以通过try/catch捕获异常。
58wvjzkj3#
如果一个进程挂起,那么将没有退出代码,因为它是自己退出的。
我会尝试监控进程,看看它是否仍然活着,就像@ Xp或其他方法所建议的那样。