- やりたいことはバッチをたたいた結果を標準出力で見つつ、ファイルでも確認できるということ
- しかし、Windowsのコマンドプロンプトではリダイレクトでのファイル出力と標準出力を同時にすることができない
- で、一番手っ取り早いのは、リダイレクトの後にtypeコマンドを仕込んでおくだけ
- 実際は同時に出力されているわけではないので、状況に応じて使えるか使えないか判断する(だからタイトルで「している風に見せる」と付けた)
例1
@echo off
rem Dドライブは存在しない
xcopy /E /Y /I C:¥test¥from D:¥test¥to > example1.log 2>&1
type example1.log
pause
無効なドライブ指定です
0 個のファイルをコピーしました
続行するには何かキーを押してください . . .
例2
@echo off
rem no_memberテーブルは存在しない
sqlcmd -S VMGUEST1¥SQLEXPRESS -U test -P test -Q "update no_member set member_name='変更後の名前' where member_id = 1" -o example2.log
type example2.log
pause
メッセージ 208、,レベル 16、状態 1、サーバー VMGUEST1¥SQLEXPRESS、行 1
オブジェクト名 'no_member' が無効です。
続行するには何かキーを押してください . . .
やりたいことを整理して、やろうとしていることを疑って考えてみると、案外簡単なやり方を見つけることができる
- このエントリーを書いた本当の理由は、この気づきを残しておきたかったから
- 今回の方法でやるまでは「標準出力とファイル出力は同時でなければならない、要はteeコマンドやろ?」という考えにずっと縛られていて、safetee*1を使ったりしたこともあった
- で、今回の思考の過程はこのような感じ
- やりたいこと:バッチをたたいた結果を標準出力で見つつ、ファイルでも確認できる
- やろうとしていること:標準出力とファイル出力を同時にする、要はteeコマンド
- ってことは、ファイルに出す→そのままファイルの中身をコマンドプロンプトで見せる。たったそれだけのこと?
- これで、非エンジニアにバッチ渡してたたいてもらう時に「ファイルを見てエラーメッセージが出ていないことを確認してください」って言うの心苦しいんだよなーと思っていたのが解決しそう
- エラーが発生した時もちゃんとファイルでもらえる。キャプチャが送られてきて大事なとこはよくわからない、画面消しちゃって覚えてないけどなんかエラーが出た、みたいなこともなくなったらいいな