Visual Studio 有什么方法可以捕获powershell脚本中exe文件引发的异常吗?

doinxwow  于 2023-06-06  发布在  Shell
关注(0)|答案(3)|浏览(186)

我正在写一个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块中,但没有任何运气。

xiozqbni

xiozqbni1#

Exe使用exitcodes返回错误状态而不是.NET异常。解决方法是检查$lasterrorexitcode。如果你想使用try/catch块,你可以在lastrorcode不等于零的情况下发出一个throw语句。注意:有一件事要小心-一些exe使用非零错误代码返回错误以外的状态。
下面是一个例子:

封装try/catch块

try {
    $result = some-exe.exe

    if ($lastexitcode -ne 0) {
        
        $result = $result -join "`n"
        throw "$result `n"
    }
}
catch {
  write-error "$_"
}
lztngnrs

lztngnrs2#

(可能)聪明的方法解决这个问题(前两个涉及发送击键到抛出的异常对话框,以自动消除它)
1.使用WASP powershell模块(在Codeplex上)在执行EXE后查询错误对话框的存在几秒钟,如果对话框窗口存在,则发送键将其关闭
1.使用system.diagnostics.process启动EXE,并注册3个可能事件的某种组合:Disposed、ErrorDataReceived和Exited,以区分EXE是否引发异常。
1.如果你可以将EXE作为一个程序集加载,然后执行它的Main方法,那么你就可以通过try/catch捕获异常。

58wvjzkj

58wvjzkj3#

如果一个进程挂起,那么将没有退出代码,因为它是自己退出的。
我会尝试监控进程,看看它是否仍然活着,就像@ Xp或其他方法所建议的那样。

相关问题