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

Eiv*_*eth 5 .net powershell jit exe visual-studio

我正在编写一个模仿手表行为的 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 
    }
}    
Run Code Online (Sandbox Code Playgroud)

我还尝试将[Exception]and [System.IO.IOException](我收到的具体异常)添加到 catch 块中,但没有任何运气。

Cha*_*ler 0

Exe 使用退出代码返回错误状态而不是 .NET 异常。解决方法是检查 $lasterrorexitcode。如果您想使用 try/catch 块,则如果 LastErrorcode 不等于 0,则可以发出 throw 语句。注意:需要注意的一件事是某些 exe 使用非零错误代码返回错误以外的状态。

这是一个例子:

包裹在 try/catch 块中

try {
    $result = some-exe.exe

    if ($lastexitcode -ne 0) {
        
        $result = $result -join "`n"
        throw "$result `n"
    }
}
catch {
  write-error "$_"
}
Run Code Online (Sandbox Code Playgroud)