Categories: Windows

バッチファイルの標準出力と標準エラー出力の違い

バッチファイルを実行すると、実行結果や、実行に際して生じたエラーが画面に表示されると思います。

例えば、以下のバッチを実行してみます。

@echo off
echo Hello
del test
pause

2行目のechoコマンドは、画面に文字を出力するコマンドで「Hello」をコンソールウィンドウに出力します。

3行目のdelコマンドはファイルを削除するコマンドで「test」というファイルを削除します。もし「test」というファイルが無ければエラーを出力します。

4行目のpauseコマンドは、クリック待ちを発生させるコマンドで、「続行するには何かキーを押してください...」という文字を画面に表示します。

結果、以下のような出力が得られます(実行先にはtestというファイルはなく、delはエラーを出力する前提です)。

さて、この状態だと強く意識することはありませんが、バッチファイルの出力には大きく分けて「標準出力」と「標準エラー出力」があり、ウィンドウにはデフォルトではこれらが混在して表示されていますが、内部的には分かれています。

これらが何故分かれているかというと、例えばエラーとなるメッセージのみを「errorlog.txt」などに出力することで、エラーメッセージだけを分けることができるためです。

今回の例では明らかかと思いますが、1行目「Hello」と3行目「続行するには何かキーを押してください...」は標準出力で、2行目の「~が見つかりませんでした」は標準エラー出力です。

標準出力のみ、標準エラー出力のみをファイルに出力するバッチファイル

どちらかだけを出力する場合には、上記の「test.bat」と同じディレクトリに、「test.bat」を実行して結果をテキストに出力する他のバッチを作成します。

例えば、以下のように「output.bat」を用意します。

test.bat > stdout.txt

あるいは以下でも同じ意味となります。

test.bat 1> stdout.txt

以下のような出力結果となります。標準出力のみがテキストに出力されていることがわかります。

「test.bat > stdout.txt」は、test.batを実行し、その実行結果(画面表示)を stdout.txtに出力するコマンドです。このコマンドは、デフォルトでは標準エラー出力は出力せず、標準出力のみを出力します。

このときに、何を出力するかを指定するのが、二つ目のバッチで示されている「test.bat 1 > stdout.txt」の「1」の部分です。「1」は標準出力を指していますが、標準出力のみを出力するのがデフォルトなので、省略しても問題ありません。

そして、標準エラー出力には「2」が割り当てられています。よって、以下のように書くと標準エラー出力のみをテキストに出力できます。

test.bat 2> errorlog.txt

出力結果は以下のようになります。

標準出力と標準エラー出力を別々のファイルに出力する方法

個別に両方出力したい場合は、以下のように記述することで実現できます。

test.bat 1> stdout.txt 2> errorlog.txt

1(標準出力)を「stdout.txt」に、2(標準エラー出力)を「errorlog.txt」に出力します。

標準出力と標準エラー出力を一つのファイルに出力する方法

標準出力と標準エラー出力をまとめて一個のファイルに出力したい場合には、以下で実現できます。

test.bat > output.txt 2>&1
Haruoka