プログラムでの処理の結果や、エラーを後から確認したい場合があります。
その場合、処理やエラーをテキストファイルに残しておく方法です。
ところで、バッチプログラムはコマンドライン上で操作しますがそのコマンドライン上が、標準出力(実際にはディスプレイを指しています)と言われます。
コマンドラインはよく以下のような表示が出ています。
c:\users>
コマンドラインで以下のように echo コマンドを使用すると、標準出力に文字を表示することができます。
c:\users>echo こんにちは ⏎
結果
こんにちは
では、コマンドを実行してエラーが発生した場合はどうでしょうか。その場合、標準エラー出力にエラーが表示されます。
ただ、見た目上標準出力に表示されているように見えます。
例: 存在しない「test」というコマンドを実行してみる
c:\users>test ⏎
結果
'test' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
見た目ではわかりませんが標準出力とは別の標準エラー出力側に出力されています。
ログファイルは、この出力先が違うことを活用してエラーだけ取得しログファイルとすることができます。
リダイレクトとは、あるコマンドの結果は、通常、標準出力へ出力されますがその出力先を変更する方法です。
よく利用するのがファイルへのリダイレクトです。
今のところ標準出力以外の出力先としてはファイル出力くらいしかありません(プリンターへの出力もできますが今ではほぼ利用しません)
急須に入っているお茶をいつもはお爺さんの湯呑み(ディスプレイ)に注ぐところを子供がコップ(ファイル)を差し出したので子供のコップに注ぐイメージです。
リダイレクト の記述
左 1> 右 REM 左からの標準出力を右に送る(標準出力を明示している)
左 1>> 右 REM 左からの標準出力を右に追記で送る(標準出力を明示している)
左 > 右 REM 左からの出力を右に送る(標準出力を表記を省略)
左 >> 右 REM 左からの出力を右に追記で送る(標準出力を表記を省略)
左 2> 右 REM 左からの標準エラー出力を右に送る
左 2>> 右 REM 左からの標準エラー出力を右に追記で送る
左 1> 中 2> 右 REM 左からの標準出力を中に出力し、標準エラー出力を右に出力する
左 1> 中 2>&1 REM 左からの標準出力を中に出力し、標準エラー出力は、標準出力へリダイレクトすることにより中へ出力される
REM ※>の後に&1と記述することで標準出力はリダイレクトの意味になっている
REM ※逆に 1>&2とし標準出力を標準エラー出力へ出力することもできる
通常、標準出力される
c:\users>echo こんにちは
こんにちは
log,txtにリダイレクトする
c:\users>echo こんにちは > log.txt
c:\users>
ファイルの中身を確認すると
c:\users>type log.txt
こんにちは
REM /////////////////////////////////////////////////////////////////////////////////////////////////////
REM ログファイル名の設定
REM :~a,bで文字抽出 a番目の文字からb文字数を抽出するという意味
REM YYYY=%Date:~0,4%
REM MM=%Date:~5.2%
REM DD=%Date:~8,2%
REM YYYYMMDD=%date:~0,4%%date:~5,2%%date:~8,2%
REM カレントディレクトリ=%~dp0
REM 実行したバッチファイル名=%~n0
REM /////////////////////////////////////////////////////////////////////////////////////////////////////
set LOG_FILE=%~dp0log\%~n0_%date:~0,4%%date:~5,2%%date:~8,2%.log
REM /////////////////////////////////////////////////////////////////////////////////////////////////////
REM ログフォルダの設定
REM not exist で存在しない: ログフォルダの有無確認 もしなければ作成
REM /////////////////////////////////////////////////////////////////////////////////////////////////////
if not exist %~dp0log mkdir "%~dp0log"
REM /////////////////////////////////////////////////////////////////////////////////////////////////////
REM ログファイルへの記述例
REM /////////////////////////////////////////////////////////////////////////////////////////////////////
echo %TIME% >> "%LOG_FILE%"
call コマンド >> "%LOG_FILE%" 2>&1