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つの別々のファイルにリダイレクトする必要がありますか?
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つの別々のファイルにリダイレクトする必要がありますか?
回答:
あなたが欲しい:
dir > a.txt 2>&1
構文2>&1
は2
(stderr)を1
(stdout)にリダイレクトします。あなたはまたにリダイレクトすることで、メッセージを非表示にすることができNUL
、MSDNの詳細な説明と例。
net stop w3svc >NUL 2>&1
。
2> 2.txt
機能します(または2> &1
) 2 > 2.txt
は機能しません。2 > &1
ではない。
アンダース・リンダールの答えは正しいですが、あなたがstdoutをファイルにリダイレクトし、同様に標準エラー出力をリダイレクトしたい場合、あなたはそれが確実にしなければならないことに留意すべきである2>&1
指定されたAFTER1>
それ以外の場合は動作しません、リダイレクト。
REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt
dir 2>&1 > a.txt
、最初に>
ストリーム2(stderr)をストリーム1(stdout)にリダイレクトします。次に、両方が既に結合された後、stdoutを(>
指定子なしで)ファイルにリダイレクトします。stderrを別の場所に移動したい場合は、最初にstdoutでそれに参加することはできません。
この質問に対する受け入れられた答えは正しいですが、それが機能する理由を説明することは実際にはあまりありません。また、構文がすぐに明確でないため、実際に何が起こっているのかをすばやくグーグル検索しました。この情報が他の人に役立つことを願って、ここに投稿します。
コマンドプロンプトからのエラーメッセージのリダイレクト: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
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
正しい、プロセスのファイルハンドル1はSTDOUTであり、1>
orまたはbyによってリダイレクトされます>
(1は慣例により省略できます。コマンドインタープリター[cmd.exe]はそれを処理することを知っています)。ファイルハンドル2はSTDERRで、によってリダイレクトされ2>
ます。
これらを使用してログファイルを作成している場合、出力を_uniquely_named_(たとえば、日付と時刻がスタンプされた)ログファイルに送信しない限り、同じプロセスを2回実行すると、リダイレクトされたファイルが上書きされることに注意してください( replace)以前のログファイル。
>>
(STDOUTやSTDERRのいずれかのために)APPENDファイルを置き換えることはありません。したがって、累積ログファイルを取得し、プロセスのすべての実行からの結果を表示する-通常はより便利です。
ハッピートレイル...
出力という保証、しかし、ありませんSDTOUT
し、STDERR
タイムリーなために、ライン・バイ・ラインを織り交ぜているが使用して、POSIX
リダイレクトマージの構文を。
アプリケーションがバッファリングされた出力を使用する場合、一方のストリームのテキストが他方のバッファ境界で挿入され、テキスト行の中央に表示されることがあります。
専用のコンソール出力ロガー(つまり"StdOut/StdErr Logger"
by 'LoRd MuldeR'
)は、このようなタスクに対してより信頼できる場合があります。
バッチファイル(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: "
注:これらの行は画面にのみ表示され、ファイルにリダイレクトされません。