まくまくWindowsノート
標準出力 (stdout) と標準エラー (stderr) への出力をファイルに保存する
2019-04-03

Windows コマンドプロンプトからプログラムを実行するときに、末尾に下記のような指定を行うことで、標準出力 (stdout) や標準エラー (stderr) の出力先を変えることができます。

  • > file: 標準出力をファイルへ
  • 1> file: (同上)
  • 2> file: 標準エラーをファイルへ
  • 1>&2: 標準出力を標準エラーにマージする
  • 2>&1: 標準エラーを標準出力にマージする

stdout と stderr への出力を別々にファイルに保存する

下記のようにあるコマンド (myprog) の出力結果をファイルへリダイレクトすると、デフォルトでは標準出力 (stdout) への出力のみがファイルに保存され、標準エラー (stderr) への出力はコマンドプロンプトの画面に出力されます。

C:\> myprog > log.txt

標準エラー (stderr) に対して出力された内容をファイルに保存するには、下記のように 2> file を使って stderr の内容をリダイレクトします。

例: myprog コマンドの標準出力を stdout.txt へ、標準エラーを stderr.txt へ保存

C:\> myprog > stdout.txt 2> stderr.txt

stdout と stderr への出力をまとめて 1 つのファイルへ保存する

標準エラーまで含めてファイルに保存したいことがあります。 2>&1 というのは、stderr (2) の出力をリダイレクトして (2>)、stdout (1) にマージする (&1) ということを表しています。 あとは、マージされた stdout への出力をファイルにリダイレクト (> file) すれば、結果として stdout と stderr の内容がまとめてファイルに保存されることになります。

例: myprog コマンドの標準出力と標準エラーをまとめて log.txt に保存

C:\> myprog > log.txt 2>&1
ちなみに、Linux の bash で同様のことを行うには、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 コマンドで標準エラーへ出力する

バッチファイルを作成しているときに、echo コマンドでエラー情報を出力したいことがあるかもしれません。 そのような場合は、下記のように標準出力を標準エラーへマージする (1&>2) ことで、実質的に echo コマンドの出力が標準エラーに対して行われることになります。

sample.bat(エラー出力するバッチファイル)

@echo off
echo この行は標準出力に出力されます
echo この行は標準エラーに出力されます 1>&2

上記のようなバッチファイルの出力を下記のようにファイルに保存しようとすると、1 行目の echo 出力のみがファイルに保存され、2 行目の echo 出力はそのままコマンドプロンプト上に表示されます。

C:\> sample.bat > log.txt
この行は標準エラーに出力されます

エラー出力を抑制する

エラー出力 (stderr) への出力を nul へリダイレクトすることで、コマンドのエラー出力を抑制することができます。

例: コマンド myprog のエラーを表示しない

C:\> myprog 2> nul
2019-04-03