いつもお世話になっております。
RfromLです。
今回はバッチスクリプトのサブルーチン化についてです。
1.はじめに
今回はバッチスクリプト内で何度も同じ処理をしている場合に処理をサブルーチン化する方法についてです。
同一バッチスクリプト内で同じ処理を行うたびに記述していると、無駄にステップ数が増加して読みづらくなりますし、共通して使っている処理に修正が入った時に修正する箇所が増えてしまいます。
同一処理を何度も実行する場合は、サブルーチン化してソースコード上の記述を一箇所にしておくと修正が発生しても直すのが楽になります。
2.使用コマンド
処理のサブルーチン化には「call」コマンドと、ラベルを使用します。
以下、callコマンドのヘルプ(コマンド「call /?」の実行結果)より一部抜粋
CALL コマンドは、CALL のターゲットとしてラベルを受け付けるようになります。
構文は、次のとおりです:
CALL :ラベル 引数
指定された引数で新しいバッチ ファイル コンテキストが作成され、指定
されたラベルの次の文に制御が渡されます。バッチ スクリプト ファイルの
最後に 2 回到達することによって、2 回 "終了" する必要があります。
1 回目に最後に到達したときには、制御は CALL 文の次の行に返されます。
2 回目に、バッチ スクリプトが終了します。バッチ スクリプトから "戻る"
ための GOTO :EOF 拡張機能の説明については、GOTO /? と入力してください。
ヘルプの記載を参考にすると以下のような書き方になります。
@echo off
rem ------------
rem 処理
rem ------------
call :TIMEGET
echo Datedisplay:%DATETIME%
pause
exit /b 0
rem ------------
rem サブルーチン
rem ------------
:TIMEGET
set DATETIME=%DATE:~0,4%年%DATE:~5,2%月%DATE:~8,2%日 %TIME:~0,2%時%TIME:~3,2%分%TIME:~6,2%秒
現在のシステム日時を変数「DATATIME」に格納する処理をサブルーチン化しています。
ここで行っている処理をまとめると以下のようになっています。
①callでラベル「TIMEGET」に飛びます。
②ラベル「TIMEGET」の箇所にてsetコマンドで変数「DATETIME」にシステム日時を格納します。
③call元にもどってechoで変数「TATETIME」を表示します。
これをバッチスクリプトにして実行すると以下のようになります。

システム日時情報が表示されます。
3.使用例
使用例として処理開始メッセージと処理終了メッセージに日付情報を使用し、いっこのサブルーチンを利用して2か所で日付情報を表示します。
また、サブルーチンがちゃんと2回呼ばれていることを確認するため、処理開始メッセージを表示したあと間にtimeoutコマンド(指定した時間の間、処理を一時停止)で10秒間停止してから処理終了メッセージを表示します。
3-1.コード内容
今回作成したスクリプトファイルのコード内容は以下の通りです。
[ DateSubroutine.bat ]
@echo off
@rem 実行バッチファイルディレクトリ設定
set CMD_PATH=%~dp0
@rem 処理ID設定(バッチファイル名)
set BATCH_ID=%~n0
@rem ------------------------------------------------------------
@rem - 開始処理
@rem ------------------------------------------------------------
@rem 日時情報取得
call :TIMEGET
@rem 処理開始メッセージ表示
echo %BATCH_ID% %YYYY%年%MM%月%DD%日 %HH%時%MI%分%SS%秒 処理開始
@rem ------------------------------------------------------------
@rem - 処理一時停止
@rem ------------------------------------------------------------
@rem 10秒停止
timeout /T 10
@rem ------------------------------------------------------------
@rem - 終了処理
@rem ------------------------------------------------------------
:END
@rem 日時情報取得
call :TIMEGET
@rem 処理終了メッセージ表示
echo %BATCH_ID% %YYYY%年%MM%月%DD%日 %HH%時%MI%分%SS%秒 処理終了
@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.機能説明
①処理開始メッセージ表示
・日時情報取得サブルーチンをcallし、現在システム日時情報を変数に格納
・echoコマンドで現在システム日時情報が格納された変数の内容を表示
②処理を一時停止
・停止時間10秒を指定してtimeoutコマンドを実行
③処理開始メッセージ表示
・日時情報取得サブルーチンをcallし、現在システム日時情報を変数に格納
・echoコマンドで現在システム日時情報が格納された変数の内容を表示
4.実行結果確認
①バッチスクリプトをダブルクリックして実行

②表示されたメッセージを確認

一回目のサブルーチン呼び出しでシステム日時が表示されることを確認。
timeoutコマンドにより、処理が停止します。

10秒経過後、もう一度サブルーチンが呼び出され10秒経過した内容でシステム日時が表示されることを確認できました。
以上です。
宜しくお願い致します。