バッチスクリプトでリダイレクト
Windowsでも、コンソールプログラム(黒い画面が上がるプログラム)の
標準出力(画面表示)や標準エラー出力(これも画面表示か)を、
ファイルに出力(リダイレクト)できます。
標準出力のリダイレクト
例えば、「dir」の結果を「dir.txt」に出力したい場合は、コマンドプロンプトを起動し
> dir > dir.txt
「dir.txt」に追記したい場合は、
> dir >> dir.txt
標準エラー出力のリダイレクト
例えば、「dir」のエラーを「err.txt」に出力したい場合は、
> dir 2> err.txt
通常、何も出ないですけど、、、。
こちらも追記したい場合は、
> dir 2>> err.txt
標準出力と標準エラーを同じファイルに出力する
> dir > dir.txt 2>&1
これは、順番が重要。
リダイレクトは、順番に解釈されるからです。
その前に、この「2」ってヤツですが、、、ファイル・ディスクリプタと言いまして
ファイル・ディスクリプタ | 意味 |
---|---|
0 | 標準入力。入力で省略すると0指定となる |
1 | 標準出力。出力で省略すると1指定となる |
2 | 標準エラー出力 |
となっています。
で、「dir > dir.txt 2>&1」を翻訳すると
- 「> dir.txt」は、「標準出力」を「dir.txt」に出力する
- 「2>&1」は、「標準エラー出力」を「&1」すなわち「今の標準出力と同じ」に出力する、ので、「dir.txt」に出力する
これを逆に
> dir 2>&1 > dir.txt
とすると、
- 「2>&1」は、「標準エラー出力」を「&1」すなわち「今の標準出力と同じ」に出力する、ので、「画面」に出力する
- 「> dir.txt」で、「標準出力」を「dir.txt」に出力する
となります。
ちなみに、先ほどのファイル・ディスクリプタの説明から判ると思いますが、
> dir > dir.txt
は、
> dir 1> dir.txt
と同じです。
愚痴です
なんでこんなことを書いたかと言えば、会社で以下のようなやり取りがあったため。
A「DLLのログが出ないんですが」 私「(DLLは私が作ったんじゃないけど)それは呼び出し元のこの設定次第です」 A「Bさん、この設定はどうなってますか?」 B「何も渡してないです、、、この辺で初期化して0が、、、」 私「(NULL?んなわけねーべ。エラーになるっつーの)」 A「あ、そこで設定してますね」 B「ほんとだ。STDERRですね」 A「画面かぁ。ファイルに欲しいんですよね。では、これを改造して、、、」 私「(アホかい!)標準エラー出力をリダイレクトすればいいんじゃないですか?」 A「たしか、標準エラーはリダイレクトできないんじゃ?」 私「(あほ・アホ・あほぅ)『>』でなくて『2>』で出来ますよ」 A「全然わかんない」 私「いやだから、リダイレクトの時『2>』にすれば出来るんですよ」 A「『>』の代わりに『2』を書けばいいのか」 私「(なんでそんな結論になる)いえいえ『2>』としてください」 B「へー、知らなかった」
、、、んだ、こらぁ!
このWindowsべったりどもめっっっ!!!
技術者ならシェルの知識くらい持っとけ!
Windowsのバッチスクリプトも一緒じゃコラ。
いや、みょーに、腹が立ったので。
そんなもん、ってこたぁ、わかってますです。
今時、コマンドプロンプトからプログラム起動して喜んでるのは、私くらいのものです。
しかしねぇ、、、。
技術者でしょーに。