10

スローされているエラーメッセージをキャプチャする必要がある PowerShell スクリプトを作成しています。注: PowerShell によると、エラーはなく、コマンドは正常に実行されます。

例: SVN リンクからパッケージをダウンロードしようとしました。リンクは実際には存在しません。スクリプトがコンソールにエラー メッセージを表示しています。ただし、$_または$?またはを確認しようとしたときに$error、エラー メッセージは表示されませんでした。ただし、$LASTEXITCODE戻り値は 1 です。正確なエラー メッセージを取得する必要があります。

4

3 に答える 3

31

エラー メッセージが表示された場合は、エラー ストリームをキャプチャする必要があります。

$msg = command 2>&1

また

command 2>error.txt

PowerShell は、それぞれの出力をキャプチャするためにファイルにリダイレクトできるさまざまなストリームにメッセージを書き込みます。

  • ストリーム 1 (デフォルト): 通常の出力 ("STDOUT")
  • ストリーム 2: 外部プログラムからのエラー メッセージを含むエラー メッセージ ("STDERR")
  • ストリーム 3: 警告メッセージ
  • ストリーム 4: 詳細メッセージ
  • ストリーム 5: デバッグ メッセージ
  • ストリーム 6: 情報メッセージ(PowerShell v5 以降のみ)

ファイル内の特定のストリームをキャプチャするには、ストリーム番号をファイル名にリダイレクトする必要があります。例えば

command 2>"C:\path\to\error.log"

commandは、 によって生成されたすべてのエラー メッセージをファイルに取り込みますC:\path\to\error.log2>>実行ごとにファイルを上書きするのではなく、ファイルに追加する場合は、代わりに使用2>します。

他のストリームを STDOUT と組み合わせて、すべてのコマンド出力を処理/リダイレクトすることもできます。

command >>"C:\path\to\all.log" *>&1

ストリームとリダイレクトの詳細については、またはこの Scripting Guy の記事を参照Get-Help about_Redirectionてください。

注目に値するもの:

  • リダイレクトは PowerShell v3 で導入された*>ため、PowerShell v2 以前では機能しません。
  • PowerShell v5 では、新しいストリーム ( InformationWrite-Host 、ストリーム番号 6) が導入されました。これは、コマンドレットの目的を理解していないために悪用され続けたためです。
于 2013-07-02T08:47:09.410 に答える