コマンドの結果をファイルに保存する(標準出力と標準エラー出力)
今回はコマンドプロンプト上のコマンドの結果をファイルに保存する方法についてです。バッチファイルを実行させるときや、何かの処理の結果を記録しておきたいときには必須のテクニックになりますので、きちんと理解して楽をしましょう。
標準出力と標準エラー出力
コマンドプロンプトで何かコマンドを入力、実行したときに表示されるメッセージは、コマンドプロンプト上では見分けがつきませんが、実は以下の2種類に明確に分かれています。
- 標準出力
- 標準エラー出力
ちょっと具体的に見てみましょう。
上記のコマンドの結果を見てみてください。単純なdirコマンドはディレクトリの中身を表示しています(何もないですが)。dir hogeコマンドは、hogeというサブディレクトリが存在しないので「ファイルが見つかりません」と表示されています。
コマンドプロンプト上ではすべてコマンドの結果が表示されているだけにしか見えませんが、実はすでに標準出力と標準エラー出力が混ざっています。
ここでリダイレクトコマンドに登場してもらいます。「>」とリダイレクトすると、標準出力のみがリダイレクトされます。これを使って標準出力だけをファイルにリダイレクトさせてみます。
なかなか面白い結果になりますね。dirコマンドの結果は(特にエラーもなかったので)すべて標準出力にのみ出力されているわけです。一方dir hogeコマンドは、標準出力にある程度出力したところで、ファイル(フォルダ)が存在しなかったため、標準エラー出力に「ファイルが見つかりません」と出力していたわけです。
標準エラー出力をリダイレクトするには「2>」コマンドを使います。ちょっとやってみましょう。
見事、標準エラー出力を別ファイルに出力させることができました。
結果を出力させるには「>」コマンドでリダイレクトさせればいい、と覚えている人が多いですが、標準出力のみをリダイレクトさせると、標準エラー出力に出力されたメッセージを取りこぼしてしまうので注意してください。
結果を1つのファイルに保存する
ここまでで、きちんとコマンドの結果をファイルに保存したいならば、標準出力と標準エラー出力の両方をリダイレクトさせてあげないといけないことがわかりました。それでは1つのファイルに保存させてみましょう。
と、このように単純に同じファイルに対して標準出力と標準エラー出力をリダイレクトさせるように書いてしまうと、両方のプロセスで同じファイルをつかみに行ってしまい、うまくいきません。
これを解決するには「標準エラー出力を標準出力にリダイレクト」します。なんだか文章で書くと難しいですが、コマンドは簡単です。
これでめでたく標準出力と標準エラー出力を同じファイルに収めることができました。「&1」というのは、標準出力のことを表しています。
(余談)ついでにいうと「&1」が標準出力なら「&2」が標準エラー出力で、これを使えば「標準出力を標準エラー出力にリダイレクト」することもできそう……と思って試してみたのですが、できませんでした…。
ファイルへの追記
ここまでの説明でリダイレクトは「>」というコマンドを使ってきましたが、これはファイルの新規作成です。既存のファイルがあっても上書きされます。複数コマンドの結果を1つのファイルに保存したいような場合には「追記」にする必要がありますが、これは「>>」というように2つ繋げることで実現できます。
>旅人さん
確かに出来ました!情報ありがとうございます!
指定する順番が重要なんですね~。
最後の余談について。
標準出力→標準エラーの件
dir hoge 2>error.log >&2
にすれば、できますよ。