しもむブログ

技術メモ。といっても高度なことは書けないので…初心者がハマったところや、ググってもすぐには出てこないようなものを書くつもり。

Windowsで標準出力とファイルの両方へ出力している風に見せる

  • やりたいことはバッチをたたいた結果を標準出力で見つつ、ファイルでも確認できるということ
  • しかし、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コマンド
      • 疑ってみると…
        • もしかして「同時」である必要はない?
    • ってことは、ファイルに出す→そのままファイルの中身をコマンドプロンプトで見せる。たったそれだけのこと?
  • これで、非エンジニアにバッチ渡してたたいてもらう時に「ファイルを見てエラーメッセージが出ていないことを確認してください」って言うの心苦しいんだよなーと思っていたのが解決しそう
  • エラーが発生した時もちゃんとファイルでもらえる。キャプチャが送られてきて大事なとこはよくわからない、画面消しちゃって覚えてないけどなんかエラーが出た、みたいなこともなくなったらいいな