更新 :
-
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とは異なり、信頼できる成功指標ではありません。 。