やりたいこと:コマンドプロンプト(DOS窓)の作業履歴を残すために、実行したコマンドと実行結果をテキストファイルに出力したい。
コマンドの実行結果だけであればリダイレクトで事足りるのですが、実行したコマンドは出力されないので何か工夫が必要だなと思って調べてみました。
↓例:コマンド「ping 127.0.0.1」の結果をlog.txtに出力
D:\work\test>type log.txt
127.0.0.1 に ping を送信しています 32 バイトのデータ:
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
127.0.0.1 からの応答: バイト数 =32 時間 =1ms TTL=128
127.0.0.1 からの応答: バイト数 =32 時間 =1ms TTL=128
127.0.0.1 からの応答: バイト数 =32 時間 =1ms TTL=128
127.0.0.1 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 0ms、最大 = 1ms、平均 = 0ms
こんな感じで「ping 127.0.0.1」がlog.txtに出力されません。
(完成形)バッチファイルのエコー機能を使う
考えたコマンド実行方法が以下の通りです。
@echo on
%~1
D:\work\test>log.bat “ping 127.0.0.1” >> log.txt 2>&1
D:\work\test>type log.txt
D:\work\test>ping 127.0.0.1
127.0.0.1 に ping を送信しています 32 バイトのデータ:
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
127.0.0.1 からの応答: バイト数 =32 時間 =1ms TTL=128
127.0.0.1 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 0ms、最大 = 1ms、平均 = 0ms
何をやっているのかというと、log.batに実行したいコマンド(ping 127.0.0.1)を引数として渡して実行し、その結果をlog.txtに出力しています。
ログ出力用のバッチファイル
用意したバッチファイルの中身は2行だけです。各行の意味をみていきます。
@echo on
%~1
@echo on
%~1
実行結果をテキストファイルに出力する
log.bat “ping 127.0.0.1” >> log.txt 2>&1
テキストファイルに出力することを意味するのが「>> log.txt 2>&1」の部分。
リダイレクト
リダイレクトはコマンドの実行結果を出力先ファイルへ出力します。
コマンド > 出力先ファイル
コマンド >> 出力先ファイル
「>」の場合は上書き書き込み、「>>」は追加書き込みです。出力先ファイルが存在しない場合は自動的に新規ファイルが作成されます。
標準出力、標準エラー出力
2>&1
これは標準出力と標準エラー出力どちらともファイルに出力するための記述です。
エラーが出た時のログも残したいので記述します。
雑記
調べた感じ、この方法しか見つかりませんでした。(他にうまい方法があれば知りたい。)
コマンドプロンプトにはLinuxのteeのようなコマンドがないため、リダイレクトで実行結果をファイルに書き出すと画面に結果が表示されません。
実行結果をDOS窓上で確認したい場合は、コマンド実行結果をファイルに書き出した後、
typeコマンドで実行結果の吐き出し先ファイルを開いて確認するとよいでしょう。
コマンドの実行結果は実行直後すぐに確認したいケースがほとんどだと思うので、typeコマンドを自動化する方法を考えてもよいかもしれませんね。