2

次のスニペットを検討してください。

function fail {
    throw "simulated failure"
}
fail

スクリプトを実行すると、デフォルトの例外処理により、例外がスローされた行とコマンドが出力されます。

simulated failure
At D:\tmp\Untitled1.ps1:2 char:10
+     throw <<<<  "simulated failure"
    + CategoryInfo          : OperationStopped: (simulated failure:String) [],     RuntimeException
    + FullyQualifiedErrorId : simulated failure

一方、例外をキャッチして自分で印刷すると、次のようになります。

function fail {
    throw "simulated failure"
}
try {
    fail
} catch {
    Write-Error $_
    exit 1
}

Write-Error の出力は、エラーがスクリプト内で発生したことのみを示しています。

D:\tmp\Untitled2.ps1 : simulated failure
At line:1 char:16
+ .\Untitled2.ps1 <<<<
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Untitled2.ps1

最初のケースと同じ出力を得るにはどうすればよいですか?

注: 例外をキャッチする理由は、「exit 1」を実行するためです。デフォルトでは、powershell は例外の後でも 0 で終了するため、スクリプトは成功したように見えます。

4

1 に答える 1

4

これは些細なことでした。Write-Errorを使用するべきではありませんが、例外を直接出力するだけです。

function fail {
    throw "simulated failure"
}
try {
    fail
} catch {
    $_
    exit 1
}

出力は次のとおりです。

simulated failure
At D:\tmp\Untitled2.ps1:2 char:14
+         throw <<<<  "simulated failure"
    + CategoryInfo          : OperationStopped: (simulated failure:String) [], RuntimeException
    + FullyQualifiedErrorId : simulated failure

アップデート:

このアプローチは明らかに出力ストリームに書き込みます。代わりに(Write-Errorのように)エラーストリームに書き込みたい場合は、この投稿によると、おそらく運が悪いでしょう:PowerShellで標準エラーに書き込むにはどうすればよいですか?。Write-Errorを使用して特定の文字列を書き込むことはできず(独自のものを追加します)、リダイレクトを適切に処理するWrite-Errorに相当するものはありません。個人的には、Out-Defaultを模倣しているが、現在のパイプライン要素のエラーストリームに書き込むOut-Errorコマンドレットを確認したいと思います。

于 2012-05-09T16:00:44.473 に答える