【バッチスクリプト】echoメッセージをリダイレクトでログファイルに出力


いつもお世話になっております。
RfromLです。

今回はバッチスクリプトを実行した際の処理メッセージ等をログファイルに出力する処理についてです。

1.はじめに

バッチスクリプトを実行した際にechoでウィンドウ上に処理メッセージを表示するだけだと処理が終了してコマンドプロンプトを閉じるとメッセージが確認できなくなってしまうのでログファイルにメッセージを出力するようになっていると後で実行結果を確認できます。


2.使用コマンド

ログファイルの出力にはリダイレクトを使用します。
リダイレクトを使ってechoメッセージをファイル出力する書式は以下の通りです。

rem 書式①
echo 処理のメッセージ> ファイル名

rem 書式②
echo 処理のメッセージ>> ファイル名

書式①の「>」(大なり)一個を指定の場合は、出力先に既に同名のファイルがあっても内容を新規のメッセージで上書きします。
出力先に既に同名のファイルが無い場合は、新規でファイルを作成してメッセージを出力します。

書式②の「>>」(大なり)二個を指定の場合は、出力先に既に同名のファイルがあるとファイル内の情報に新規のメッセージを追加します。
出力先に既に同名のファイルが無い場合は、書式①の時と同様で新規でファイルを作成してメッセージを出力します。

3.使用例

使用例として、処理開始メッセージと処理終了メッセージに日時情報取得サブルーチンで日時情報を取得し、取得した日時情報をechoとリダイレクトでログファイルに出力するバッチスクリプトを作成。

なお、リダイレクトに出力すると標準出力(コマンドプロンプト上)にメッセージが出力されなくなくなるのでログファイルに出力するメッセージと同様のメッセージをリダイレクト無しのechoで表示します。

3-1.コード内容

今回作成したスクリプトファイルのコード内容は以下の通りです。

[ LogOutput.bat ]

@echo off

@rem 実行バッチファイルディレクトリ設定
set CMD_PATH=%~dp0

@rem 処理ID設定(バッチファイル名)
set BATCH_ID=%~n0

@REM ログファイルディレクトリ設定
SET LOGDIR=%CMD_PATH%\LOG

@REM ログファイルフルパス
SET LOGFILE=%LOGDIR%\%BATCH_ID%.%DATE:~8,2%.log

@rem ------------------------------------------------------------
@rem - 開始処理
@rem ------------------------------------------------------------
@rem 処理開始メッセージ表示
call :TIMEGET
echo %BATCH_ID% %YYYY%年%MM%月%DD%日 %HH%時%MI%分%SS%秒 処理開始
echo %BATCH_ID% %YYYY%年%MM%月%DD%日 %HH%時%MI%分%SS%秒 処理開始>> %LOGFILE%


@rem ------------------------------------------------------------
@rem - 処理一時停止
@rem ------------------------------------------------------------
@rem 10秒停止
timeout /T 5

@rem ------------------------------------------------------------
@rem - 終了処理
@rem ------------------------------------------------------------
:END
@rem 処理終了メッセージ表示
call :TIMEGET
echo %BATCH_ID% %YYYY%年%MM%月%DD%日 %HH%時%MI%分%SS%秒 処理終了
echo %BATCH_ID% %YYYY%年%MM%月%DD%日 %HH%時%MI%分%SS%秒 処理終了>> %LOGFILE%
echo.>> %LOGFILE%

@rem 表示メッセージ確認の為、処理一時停止
pause

exit /b 0

@rem ------------------------------------------------------------
@rem - 日時情報取得サブルーチン
@rem ------------------------------------------------------------
:TIMEGET

@rem システム日付取得(YYYY=年,MM=月,DD=日,WK=曜日)
set YYYY=%date:~0,4%
set MM=%date:~5,2%
set DD=%date:~8,2%
set WK=%date:~0,1%

@rem システム時刻取得(HH=時)
@rem ※HH部分(時間部分)の1文字目をチェックして
@rem   空白の場合は頭ゼロ埋めでセット
set HHCHK=%time:~0,1%

if "%HHCHK%"==" " (
  set HH=0%time:~1,1%
) else (
  set HH=%time:~0,2%
)

@rem システム時刻取得(MI=分,SS=秒)
set MI=%time:~3,2%
set SS=%time:~6,2%

set DATETIME=%YYYY%%MM%%DD%_%HH%%MI%%SS%

※メッセージを確認するため、終了処理のブロックに「pause」を記載して処理を一時停止するようにしています。

3-2.ディレクトリ構成

3-3.ファイルID

ログファイル名は以下の書式で設定

 バッチスクリプト名.DD.log

「バッチスクリプト名」は、今回作成したバッチスクリプト名から拡張子を除外したものを設定。
「DD」は、システム日付のYYYY/MM/DDからDDの部分を設定。

[具体例]
今回作成したバッチスクリプト[ LogOutput.bat ]を2025年3月22日に実行した場合、ログファイル名は以下となります。
 「LogOutput.22.log」

3-4.機能説明

①処理開始メッセージ表示
・日時情報取得サブルーチンをcallし、現在システム日時情報を変数に格納
・echoコマンドで現在システム日時情報が格納された変数の内容を表示
・echoコマンドで現在システム日時情報が格納された変数の内容をリダイレクトでログファイルに出力

②処理を一時停止
・停止時間5秒を指定してtimeoutコマンドを実行

③処理開始メッセージ表示
・日時情報取得サブルーチンをcallし、現在システム日時情報を変数に格納
・echoコマンドで現在システム日時情報が格納された変数の内容を表示
・echoコマンドで現在システム日時情報が格納された変数の内容をリダイレクトでログファイルに出力


4.実行結果確認

①バッチスクリプトをダブルクリックして実行



②表示されたメッセージを確認
バッチスクリプトを実行すると処理開始メッセージを表示してtimeoutコマンドで5秒間処理が一時停止することを確認。



5秒経過後、処理終了メッセージを表示することを確認。




③ログファイル出力先を確認
ログファイルが「バッチスクリプト名.DD.log」の書式で作成されていることを確認。




④ログファイル出力内容を確認
ログファイルを開くと処理開始メッセージと処理終了メッセージが出力されていることを確認。



以上です。
宜しくお願い致します。


タイトルとURLをコピーしました