標準エラー出力をファイルへ出力

広告

コマンドを実行した時にエラーが発生した場合には標準出力ではなく標準エラー出力に対して出力が行われます。デフォルトでは標準出力と同じく標準エラー出力も画面に設定されていますが、標準エラー出力をリダイレクトすることで画面ではなく別のデバイスへ出力を行うことができます。

よくある間違いとして実行結果はファイルに出力されているけどエラーだった場合は画面に出力されてしまうということがあります。例として次のように標準出力をファイルへ出力するように指定した場合を考えてみます。

コマンド > ファイル名

コマンドが正常に実行された場合には出力はファイルへ行われますが、エラーが発生した場合には標準エラー出力に対して行われます。上記では標準エラー出力に対する設定はしていませんので、エラーが発生した場合にはデフォルトの設定のまま画面に出力されることになります。

エラーが発生した場合もファイルなどに出力したい場合には、標準エラー出力に対するリダイレクトの設定が必要となります。

標準エラー出力のリダイレクトに関する書式は次の通りです。

コマンド 2> ファイル名

「2>」の左側が標準エラー出力に対して出力したものを、「2>」の右側のデバイスに対して出力するように指定しています。なお「2」は標準エラー出力であるSTDERRハンドルを表す数値です。標準出力の場合と異なり「2」は省略できません。

例えばDIRコマンドの結果をresult.txtというファイルに書き込むには次のように入力します。

dir 2> result.txt

出力先としてファイル名を指定した場合、指定したファイルが存在しない場合はファイルを新規に作成した上で出力を行います。既にファイルが存在した場合には新しい内容で上書きします(元々ファイルに含まれていた内容は無くなりますので注意して下さい)。

出力先に指定したファイルが既に存在していた場合、上書きではなく追加書き込みにするには次の書式を使います。

コマンド 2>> ファイル名

ファイルが既に存在していた場合、標準エラー出力の結果を既存のファイルの内容の最後に追加で書き込みます。

サンプル

では実際に試してみます。まずは次のように実行します。

p3-1

ファイルの拡張子が「.bat」のファイルの一覧を出力しています。標準出力をリダイレクトでresult.txtファイルへ出力していています。TYPEコマンドでファイルの中身を確認してみます。

p3-2

DIRコマンドの実行結果がファイルに出力されていることが確認できます。

今度は次のように実行してます。

p3-3

ファイルの拡張子が「.exe」のファイルの一覧を出力しています。今回該当するファイルが無いため「ファイルが見つかりません」というエラーが画面に表示されます。今回は標準出力はリダイレクトの設定がされていましたが、標準エラー出力については何も設定されていないため、エラーが発生した場合は標準エラー出力のデフォルトの出力先である画面に表示されます。

なおresult.txtファイルをテキストエディタで見てみると次のように表示されます。

p3-4

result.txtにも一部出力が行われています。これはDIRコマンドの実行結果として、エラーが発生するまでに出力されていたものは標準出力に対して出力されたいたが、エラーが発生した時点で今度は標準エラー出力に出力されていることを表しています。

では今度は標準エラー出力をファイルへリダイレクトしてみます。

p3-5

先ほどと逆で、エラーが発生するまでに出力されたものは標準出力のデフォルトの出力先である画面に表示されています。そしてエラーが発生した後に出力されたものは標準エラー出力へ出力されますが、今回はリダイレクトで result.txt ファイルへ出力されます。

ではTYPEコマンドを使って、result.txtの中身を確認してみます。

p3-6

標準エラー出力に出力された内容がファイルに格納されていることが確認できます。

このように標準出力と標準エラー出力に対する出力は別々に管理されていますので注意が必要です。

標準出力と標準エラー出力を両方ともファイルへ出力する

標準出力と標準エラー出力の両方をファイルへ出力する場合には次のように記述して下さい。

コマンド > ファイル名 2>&1

この書式の中で「2>&1」は標準エラー出力(ハンドル数値2)を標準出力(ハンドル数値1)へリダイレクトすることを表しています。ファイルではなく既存のハンドルへリダイレクトする時は「&」の後にハンドルの数値を指定します。結果としてこの書式は標準エラー出力を標準出力へ出力し、さらにコマンドの標準出力をファイルへ出力しますので、標準出力も標準エラー出力もファイルへ出力されることになります。

では先ほどサンプルを次のように書き換えて実行します。

p3-7

エラーが発生しているはずですが画面には何も表示されていません。TYPEコマンドを使ってresult.txtファイルの中身を確認してみます。

p3-8

標準出力に出力されているものも、標準エラー出力に出力されているものも、どちらもファイルに書き込まれていることが確認できました。

( Written by Tatsuo Ikura )