更新 :
-
if ($LASTEXITCODE -eq 0) ...
このアプローチは、引き続き外部プログラムで堅牢に機能します。 - ただし、v7.2より前の実験機能
名前付き
PSNotApplyErrorActionToStderr
公式機能になります、if ($?) ...
堅牢にも動作します-この回答 を参照してください 詳細については。
$LASTEXITCODE -eq 0
を使用します $?
ではなく ゼロ以外の終了コードを確実に検出するため (通常は信号障害)外部プログラムによって報告されます。
その後、 *> $null
を使用できます すべての出力を分類的に抑制する そのリダイレクトが$?
に与える影響を心配する必要はありません。 :
mysql -u root --password=mypass -e "show databases" *>$null
if ($LASTEXITCODE -eq 0) {
"Hooray!"
} else {
"Boo!"
}
PowerShellのエラーストリームを含むリダイレクトを使用する-明示的に2>
を介して または暗黙的に*>
を介して -は、そのストリームを介してデータが受信された場合を意味します-外部プログラムを呼び出す場合は、 stderrからの出力を意味します。 -PowerShellは$?
を設定します $false
へ 。
ただし、外部コンソール/ターミナルプログラムの領域では、stderrはエラーを出力するためだけに使用されるわけではありません。 情報ですが、データではない情報 、ステータス情報など。したがって、stderr出力の存在から失敗を推測することはできません 。
外部コンソール/ターミナルプログラムは、終了コードを介してのみ成功ステータスを伝達します。 、PowerShellは自動$LASTEXITCODE
に反映します 変数。
上記から、 $?
$false
にすることができます 終了コードが0
であっても 、したがって、$LASTEXITCODE
とは異なり、信頼できる成功指標ではありません。 。