4

watch の動作を模倣する 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 ブロックに追加しようとしましたが、これ以上運がありません。

4

2 に答える 2

0

Exe は終了コードを使用して、.NET 例外の代わりにエラー ステータスを返します。回避策は、$lasterrorexitcode を確認することです。try/catch ブロックを利用したい場合は、lasterrorcode がゼロでない場合に throw ステートメントを発行できます。注意: 注意すべきことの 1 つ - 一部の 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 に答える