_ 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つの別々のファイルにリダイレクトするべきですか?
あなたが欲しい:
dir > a.txt 2>&1
構文2>&1
は、2
(stderr)を1
(stdout)にリダイレクトします。 NUL
、 MSDNのより多くの説明と例 にリダイレクトすることでメッセージを隠すこともできます。
Anders Lindahlの答えは正しいですが、stdoutをファイルにリダイレクトし、stderrもリダイレクトしたい場合は、2>&1
が指定されていることを確認する必要があることに注意してくださいAFTER the 1>
リダイレクト、それ以外の場合は機能しません。
REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt
この質問に対する受け入れられた答えは正しいのですが、説明するのに実際にはあまり役に立ちません なぜ それはうまくいきます。構文がすぐにはっきりしないので、実際に何が起こっているのかを見つけるためにすぐにグーグルをしました。この情報が他の人に役立つことを期待して、私はそれをここに投稿します。
コマンドプロンプトからのエラーメッセージのリダイレクト:STDERR/STDOUT
概要
'>'記号を使用してアプリケーションからの出力をリダイレクトしても、エラーメッセージが画面に表示されます。これは、エラーメッセージが標準出力ストリームではなく標準エラーストリームに送信されることが多いためです。
コンソール(コマンドプロンプト)アプリケーションまたはコマンドからの出力は、しばしば2つの別々のストリームに送信されます。通常の出力は標準出力(STDOUT)に送信され、エラーメッセージは標準エラー(STDERR)に送信されます。 ">"記号を使用してコンソール出力をリダイレクトすると、STDOUTのみがリダイレクトされます。 STDERRをリダイレクトするには、リダイレクトシンボルに '2>'を指定する必要があります。これにより、STDERRである2番目の出力ストリームが選択されます。
例
コマンド
dir file.xxx
(file.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
スクリプトの一般ログファイルにstdoutとstderrを追加するには
dir >> a.txt 2>&1
正しい、プロセスのファイルハンドル1はSTDOUTで、1>
または>
によってリダイレクトされます(慣例により、コマンドインタープリタ[cmd.exe]はそれを処理することを認識しています)。ファイルハンドル2はSTDERRで、2>
によってリダイレクトされます。
これらを使ってログファイルを作成しているのであれば、oututを_uniquely_named_(例えば日付と時刻の刻印)ログファイルに送信していない限り、同じプロセスを2回実行すると、リダイレクトされたファイルは上書きされます。前のログファイルを置き換えます。
>>
(STDOUTまたはSTDERR用)は、ファイルをAPPENDしないでREPLACEします。そのため、累積ログファイルが作成され、プロセスのすべての実行からの結果が表示されます。通常はもっと便利です。
ハッピートレイル...
@Andersがちょうどそれを掲示したので私はちょうど答えを切り出しました、しかし...
私のWindowsヘルプから、私はリダイレクトを検索しました(URL ms-its:C:\ WINDOWS\Help\ntcmds.chm ::/redirection.htm )。
>>と|について読みたいと思うかもしれません。 (パイプ)も。
ただし、POSIXリダイレクトマージ構文を使用して、SDTOUTとSTDERRの出力がタイムライン順に1行ずつ織り込まれるという保証はありません。
アプリケーションがバッファ付き出力を使用する場合、一方のストリームのテキストがもう一方のバッファ境界で挿入されることがあります。これはテキスト行の中央に表示されることがあります。
専用のコンソール出力ロガー( 'LoRd MuldeR'による "StdOut/StdErr Logger"のような)は、このようなタスクに対してはより信頼性があります。参照してください: MuldeRのオープンソースプロジェクト