Windows コマンドプロンプトからプログラムを実行するときに、末尾に下記のような指定を行うことで、標準出力 (stdout) や標準エラー (stderr) の出力先を変えることができます。
> file: 標準出力をファイルへ1> file: (同上)2> file: 標準エラーをファイルへ1>&2: 標準出力を標準エラーにマージする2>&1: 標準エラーを標準出力にマージする下記のようにあるコマンド (myprog) の出力結果をファイルへリダイレクトすると、デフォルトでは標準出力 (stdout) への出力のみがファイルに保存され、標準エラー (stderr) への出力はコマンドプロンプトの画面に出力されます。
C:\> myprog > log.txt
標準エラー (stderr) に対して出力された内容をファイルに保存するには、下記のように 2> file を使って stderr の内容をリダイレクトします。
C:\> myprog > stdout.txt 2> stderr.txt
標準エラーまで含めてファイルに保存したいことがあります。
2>&1 というのは、stderr (2) の出力をリダイレクトして (2>)、stdout (1) にマージする (&1) ということを表しています。
あとは、マージされた stdout への出力をファイルにリダイレクト (> file) すれば、結果として stdout と stderr の内容がまとめてファイルに保存されることになります。
C:\> myprog > log.txt 2>&1
command >& log.txt とします。
Windows のコマンドプロンプトよりシンプルです。
stdout (1) あるいは stderr (2) の出力を、もう一方にマージしてからファイルに出力するというメカニズムなので、下記のようにしても、stdout と stderr をまとめてファイルに出力できます。
C:\> myprog 1> log.txt 2>&1
C:\> myprog 2> log.txt 1>&2
どの場合でも、ファイルへのリダイレクト指定よりも後ろに 2>&1 を指定しなければいけないことに注意してください。
バッチファイルを作成しているときに、echo コマンドでエラー情報を出力したいことがあるかもしれません。
そのような場合は、下記のように標準出力を標準エラーへマージする (1&>2) ことで、実質的に echo コマンドの出力が標準エラーに対して行われることになります。
@echo off
echo この行は標準出力に出力されます
echo この行は標準エラーに出力されます 1>&2
上記のようなバッチファイルの出力を下記のようにファイルに保存しようとすると、1 行目の echo 出力のみがファイルに保存され、2 行目の echo 出力はそのままコマンドプロンプト上に表示されます。
C:\> sample.bat > log.txt
この行は標準エラーに出力されます
エラー出力 (stderr) への出力を nul へリダイレクトすることで、コマンドのエラー出力を抑制することができます。
C:\> myprog 2> nul