我正在编写一个模仿手表行为的PowerShell脚本。 它工作正常,直到我看到一个抛出异常的exe。
当发生这种情况时,Visual Studio中的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区块,没有任何运气。
答案 0 :(得分:0)
Exe使用exitcodes返回错误状态而不是.NET异常。解决方法是检查$ lasterrorexitcode。如果要使用try / catch块,如果lasterrorcode不等于零,则可以发出throw语句。注意:有一点要谨慎 - 某些exe使用非零错误代码来返回错误以外的状态。
以下是一个例子:
try {
$result = some-exe.exe
if ($lastexitcode -ne 0) {
$result = $result -join "`n"
throw "$result `n"
}
}
catch {
write-error "$_"
}
答案 1 :(得分:0)
(可能)解决问题的巧妙方法(前两个涉及发送按键到抛出异常对话框以自动关闭它)
在执行EXE后,使用WASP powershell模块(在Codeplex上)查询是否存在错误对话框,如果对话窗口存在,则发送密钥以将其关闭
使用system.diagnostics.process启动EXE,并注册3个可能事件的一些组合:Disposed,ErrorDataReceived和Exited,以区分EXE是否抛出异常。
如果您可以将EXE作为程序集加载,然后执行其Main方法,那么您可以通过try / catch捕获异常。