Windows cmd stdoutとstderrを単一のファイルにリダイレクトする


688

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

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

それは可能ですか、または2つの別々のファイルにリダイレクトする必要がありますか?


14
TechNet:コマンドリダイレクト演算子を使用します(これに対する回答は、ここにあるどの回答よりも優れています)。
Martin Prikryl、2016年

1
2>&1は同じファイルを再度開くことができないため
Luke

回答:


1090

あなたが欲しい:

dir > a.txt 2>&1

構文2>&12(stderr)を1(stdout)にリダイレクトします。あなたはまたにリダイレクトすることで、メッセージを非表示にすることができNULMSDNの詳細な説明と例


32
このおかげで、このUNIXシェル構文がDOSでも機能することを知りませんでした!
チェーンドライバー、2012

20
これは、すべての出力を非表示にするのに最適ですnet stop w3svc >NUL 2>&1
wasatchwizard 2013

3
@wasatchwizard Ithink私はそれで問題がありましたが、> NUL 2> NULはうまく
いきました

13
ハンドルがある場合、ハンドル(つまり2)とリダイレクト演算子(つまり>)の間にスペースを置くことはできません。したがって、2> 2.txt機能します(または2> &12 > 2.txtは機能しません。2 > &1ではない。
レッドピー

9
私はとても大好きです。「ああ、この小さな1回限りの問題は1時間ほどかかるだろう」このコメントを入力するのに、この回答を見つけるよりも時間がかかりました。
ブランドン、

195

アンダース・リンダールの答えは正しいですが、あなたがstdoutをファイルにリダイレクトし、同様に標準エラー出力をリダイレクトしたい場合、あなたはそれが確実にしなければならないことに留意すべきである2>&1指定されたAFTER1>それ以外の場合は動作しません、リダイレクト。

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

10
何が問題なのかを理解するのに何時間もかかったのはDelboyJayです。ありがとうございました!
Nam G VU

4
2>&1を1>の前に置いても意図した効果が得られないのはなぜですか?これは、 "cmd"がリダイレクトを指定する順序に応じて2つの異なる意味を与えるコマンドを解析する方法に関係していると強く思います。しかし、セマンティックルールはどこにでも文書化されていますが、これは時間を浪費する可能性があるので、これは学ぶ価値のあることだと思います。
igbgotiz 2014

12
@igbgotiz 2>&1は、「ストリーム2をストリーム1にリダイレクトする」ことを意味します。したがって、最初にストリーム1を設定する必要があります
FrinkTheBrave

3
@FrinkTheBraveですが、明示的に指定されていない場合、ストリーム1は標準出力(コンソールなど)です。それはまだそれを説明していません。
MarioDS 2015年

1
@MDeSchaepmeester、これを行う場合dir 2>&1 > a.txt、最初に>ストリーム2(stderr)をストリーム1(stdout)にリダイレクトします。次に、両方が既に結合された後、stdoutを(>指定子なしで)ファイルにリダイレクトします。stderrを別の場所に移動したい場合は、最初にstdoutでそれに参加することはできません。
cp.engr 2016

80

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

NULを使用して出力をデバイスにリダイレクトした場合dir file.xxx > 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


13

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

これらを使用してログファイルを作成している場合、出力を_uniquely_named_(たとえば、日付と時刻がスタンプされた)ログファイルに送信しない限り、同じプロセスを2回実行すると、リダイレクトされたファイルが上書きされることに注意してください( replace)以前のログファイル。

>>(STDOUTやSTDERRのいずれかのために)APPENDファイルを置き換えることはありません。したがって、累積ログファイルを取得し、プロセスのすべての実行からの結果を表示する-通常はより便利です。

ハッピートレイル...


2

出力という保証、しかし、ありませんSDTOUTし、STDERRタイムリーなために、ライン・バイ・ラインを織り交ぜているが使用して、POSIXリダイレクトマージの構文を。

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

専用のコンソール出力ロガー(つまり"StdOut/StdErr Logger"by 'LoRd MuldeR')は、このようなタスクに対してより信頼できる場合があります。

参照:MuldeRのオープンソースプロジェクト


0

バッチファイル(Windows 7以降)で、この方法が最も信頼できることがわかりました

Call :logging >"C:\Temp\NAME_Your_Log_File.txt" 2>&1
:logging
TITLE "Logging Commands"
ECHO "Read this output in your log file"
ECHO ..
Prompt $_
COLOR 0F

もちろん、必要なコマンドを使用すると、出力はテキストファイルに送られます。この方法を使用する、画面に出力がない場合でも信頼できます。


(基本的に数回前に与えられた同じ答え。)>con echo This goes to screenユーザー入力にも便利な出力を画面に強制することができます>con set /p "var="Input: "注:これらの行は画面にのみ表示され、ファイルにリダイレクトされません
ステファン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.