以前、バッチファイルを作成したこと時のソースの一部を利用して書き方の説明を備忘録を兼ねて記載します。
今回は、ラベル・サブルーチンについて、記載しています。
使用している構文やコマンド
:(コロン)
「:」はプログラムの中に処理を飛ばすための目印「ラベル」を作ります。使われ方としては主に「サブルーチン」を使う時に利用されます。バッチファイルでは他の言語と同じように処理をまとめる「関数」「クラス」は存在しません。しかし、バッチファイルで同じような役割を持たす方法はあります。それが「サブルーチン」です。サブルーチンの最後は必ず「:end」で閉じる必要があります。
記載例を以下に示します。
:example
~~ サブルーチンの処理内容 ~~
:end
※変則的な使われ方として、コメントの代わりとして使う場合もあります。サブルーチンは、呼び出されなければ処理は行われません。その点を利用して、呼び出しを行わずにコメントとして利用する方法も可能ということです。
call
既存の「別のバッチファイル」や「同一バッチ内のサブルーチン」などを呼び出す際に使われます。
また、上記のサブルーチンの呼び出しにも使用することができます。このサブルーチンを呼び出すには、以下の方法で呼び出すことが可能です。
~~ 呼出し前の処理内容 ~~
call :example
~~ 呼出し後の処理内容 ~~
サブルーチンを呼び出した後の処理については、注意が必要です。上記「:(コロン)」の説明から、サブルーチンは「ラベルの応用」であることが分かります。そのため後述の「exit /b」を記載が必要です。記載しない場合はサブルーチンの終了後に元々の処理に戻ることはないまま、バッチファイルの処理が終わってしまいます。
引数を用いる場合の :(コロン)、call
バッチファイルのサブルーチンでは、何個目の引数か?ということを意識するだけで済みます。1つ目の引数を扱いたい場合は「%1」、2つ目の引数を扱いたい場合は「%2」といった具合です。
記載例を以下に示します。後者で、前者のサブルーチンを「引数:有」で呼び出した時にサブルーチン側で引数を利用してメッセージを表示しています。
サブルーチン
:echo_msg_incollect
echo –実施結果–
echo %1です。
echo %2してください。
:end
呼び出す処理
:checkInputData_date
call :echo_msg_incollect 日時の設定値が不正 正しい値を入力
:end
実行結果
–実施結果–
日時の設定値が不正です。
正しい値を入力してください。
exit
バッチファイルの処理を強制的に終わらす際に用います。例えば、エラー処理の際やバッチ処理の終了時などです。
:forceExitApp
echo アプリを終了します。
echo;
pause > nul
exit
:end
exit /b
exit のオプションとして「/b」を付けると、callにより呼び出されたバッチ処理を終了して、呼び出し元に処理を戻すことができます。「call」の欄にも記載していますが、これを付けないと、callで呼び出された後、元の処理に戻ることなくバッチ処理が終了してしまいます。もし、呼び出した処理の後段に本来は不要な処理が書かれていた場合は、その不要な処理も実行してしまいます。
以下の例は、うるう年の判定時に用いたサブルーチンです。年の情報を引数として呼び出しています。仮にif文の中に「exit /b」がなく、年が400で割り切れる場合、その後段の3つの処理も行われてしまうことになります。
:IS_LEAP
rem << 年が400で割り切れると閏年 >>
set /a rest = %1 %% 400
if %rest%==0 (
set uruu=TRUE
exit /b
)rem << 年が100で割り切れると閏年ではない >>
set /a rest = %1 %% 100
if %rest%==0 (
set uruu=FALSE
exit /b
)rem << 年が4で割りきれると閏年 >>
set /a rest = %1 %% 4
if %rest%==0 (
set uruu=TRUE
exit /b
)rem << それ以外は閏年ではない >>
set uruu=FALSE
exit /b
:end
なお、サブルーチンで定義している変数は「exit /b」で戻した後でもそのまま使用できます。
まとめ
今回は、バッチファイル作成時のラベル・サブルーチンについてまとめました。効率よくメンテナンスができたり、役割毎にまとめられる機能になりますので、参考にしてみて下さい。