web-dev-qa-db-ja.com

Windowsのcmdの標準出力と標準エラー出力を単一のファイルにリダイレクトする

_ dos _ コマンドのすべての出力(stdout + stderr)を単一のファイルにリダイレクトしようとしています。

C:\>dir 1> a.txt 2> a.txt
The process cannot access the file because it is being used by another process.

それは可能ですか、それとも2つの別々のファイルにリダイレクトするべきですか?

623
ripper234

あなたが欲しい:

dir > a.txt 2>&1

構文2>&1は、2(stderr)を1(stdout)にリダイレクトします。 NULMSDNのより多くの説明と例 にリダイレクトすることでメッセージを隠すこともできます。

965
Anders Lindahl

Anders Lindahlの答えは正しいですが、stdoutをファイルにリダイレクトし、stderrもリダイレクトしたい場合は、2>&1が指定されていることを確認する必要があることに注意してくださいAFTER the 1>リダイレクト、それ以外の場合は機能しません。

REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt
189
DelboyJay

MSKBからの背景情報

この質問に対する受け入れられた答えは正しいのですが、説明するのに実際にはあまり役に立ちません なぜ それはうまくいきます。構文がすぐにはっきりしないので、実際に何が起こっているのかを見つけるためにすぐにグーグルをしました。この情報が他の人に役立つことを期待して、私はそれをここに投稿します。

MSサポートから取得しましたKB 110930


MSKB110930から

コマンドプロンプトからのエラーメッセージのリダイレクト:STDERR/STDOUT

概要

'>'記号を使用してアプリケーションからの出力をリダイレクトしても、エラーメッセージが画面に表示されます。これは、エラーメッセージが標準出力ストリームではなく標準エラーストリームに送信されることが多いためです。

コンソール(コマンドプロンプト)アプリケーションまたはコマンドからの出力は、しばしば2つの別々のストリームに送信されます。通常の出力は標準出力(STDOUT)に送信され、エラーメッセージは標準エラー(STDERR)に送信されます。 ">"記号を使用してコンソール出力をリダイレクトすると、STDOUTのみがリダイレクトされます。 STDERRをリダイレクトするには、リダイレクトシンボルに '2>'を指定する必要があります。これにより、STDERRである2番目の出力ストリームが選択されます。

コマンドdir file.xxxfile.xxxが存在しない場合)は、以下の出力を表示します。

Volume in drive F is Candy Cane Volume Serial Number is 34EC-0876

File Not Found

dir file.xxx > nulを使用して出力をNULデバイスにリダイレクトしても、次のように出力の一部にエラーメッセージが表示されます。

File Not Found

エラーメッセージをNULに(のみ)リダイレクトするには、次のコマンドを使用します。

dir file.xxx 2> nul

または、出力をある場所にリダイレクトし、エラーを別の場所にリダイレクトすることもできます。

dir file.xxx > output.msg 2> output.err

"&1"コマンドを使用してSTDERRの出力をSTDOUTにリダイレクトしてから、その出力をSTDOUTからファイルに送信することによって、エラーと標準出力を単一のファイルに出力できます。

dir file.xxx 1> output.msg 2>&1
74
StormeHawke

スクリプトの一般ログファイルにstdoutとstderrを追加するには

dir >> a.txt 2>&1
28
Henk Wiersema

正しい、プロセスのファイルハンドル1はSTDOUTで、1>または>によってリダイレクトされます(慣例により、コマンドインタープリタ[cmd.exe]はそれを処理することを認識しています)。ファイルハンドル2はSTDERRで、2>によってリダイレクトされます。

これらを使ってログファイルを作成しているのであれば、oututを_uniquely_named_(例えば日付と時刻の刻印)ログファイルに送信していない限り、同じプロセスを2回実行すると、リダイレクトされたファイルは上書きされます。前のログファイルを置き換えます。

>>(STDOUTまたはSTDERR用)は、ファイルをAPPENDしないでREPLACEします。そのため、累積ログファイルが作成され、プロセスのすべての実行からの結果が表示されます。通常はもっと便利です。

ハッピートレイル...

12
Max Vitesse

@Andersがちょうどそれを掲示したので私はちょうど答えを切り出しました、しかし...

私のWindowsヘルプから、私はリダイレクトを検索しました(URL ms-its:C:\ WINDOWS\Help\ntcmds.chm ::/redirection.htm )。

>>と|について読みたいと思うかもしれません。 (パイプ)も。

5
ericp

ただし、POSIXリダイレクトマージ構文を使用して、SDTOUTとSTDERRの出力がタイムライン順に1行ずつ織り込まれるという保証はありません。

アプリケーションがバッファ付き出力を使用する場合、一方のストリームのテキストがもう一方のバッファ境界で挿入されることがあります。これはテキスト行の中央に表示されることがあります。

専用のコンソール出力ロガー( 'LoRd MuldeR'による "StdOut/StdErr Logger"のような)は、このようなタスクに対してはより信頼性があります。参照してください: MuldeRのオープンソースプロジェクト

1
LigH