4

我正在编写一个模仿手表行为的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]and [System.IO.IOException](我收到的具体异常)添加到 catch 块中,但没有任何运气。

4

2 回答 2

0

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

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

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

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

于 2013-10-04T06:08:05.440 回答
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 "$_"
}
于 2013-10-02T11:26:51.147 回答