有没有办法捕获PowerShell脚本中exe文件抛出的异常?

时间:2013-10-02 09:12:06

标签: .net visual-studio powershell exe jit

我正在编写一个模仿手表行为的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区块,没有任何运气。

2 个答案:

答案 0 :(得分:0)

Exe使用exitcodes返回错误状态而不是.NET异常。解决方法是检查$ lasterrorexitcode。如果要使用try / catch块,如果lasterrorcode不等于零,则可以发出throw语句。注意:有一点要谨慎 - 某些exe使用非零错误代码来返回错误以外的状态。

以下是一个例子:

包装在try / catch块

try {
    $result = some-exe.exe

    if ($lastexitcode -ne 0) {

        $result = $result -join "`n"
        throw "$result `n"
    }
}
catch {
  write-error "$_"
}

答案 1 :(得分:0)

(可能)解决问题的巧妙方法(前两个涉及发送按键到抛出异常对话框以自动关闭它)

  1. 在执行EXE后,使用WASP powershell模块(在Codeplex上)查询是否存在错误对话框,如果对话窗口存在,则发送密钥以将其关闭

  2. 使用system.diagnostics.process启动EXE,并注册3个可能事件的一些组合:Disposed,ErrorDataReceived和Exited,以区分EXE是否抛出异常。

  3. 如果您可以将EXE作为程序集加载,然后执行其Main方法,那么您可以通过try / catch捕获异常。