前回までにバッチを関数化するのに必要な基本的なテクニックについて紹介しました。それらを使ってより実用的な処理を書くためにはもう少し準備が必要になります。
そこで今回の記事ではその準備としてcallで関数を呼び出す以外の方法でバッチを関数化する方法を紹介します。
別ファイルを呼び出す方法
バッチを関数化する時、同じファイルに関数化したい処理を書きcallで呼び出す方法を紹介してきましたが、関数化したい処理を別ファイルにまとめて書きそのファイルをcallで呼び出す事もできます。
下記が別ファイルをcallで呼び出す簡単な例です。実行する場合はbatch_function06_main.cmdとbatch_function06_sub.cmdを同じフォルダにおいた上でbatch_function06_main.cmdを実行して下さい。バッチファイルのリンクををサンプルバッチに置いています。
batch_function06_main.cmd
@echo off
rem ########################################################
rem # 変数定義
rem ########################################################
set scriptdir=%~d0%~p0
set subcmd=%scriptdir%batch_function06_sub.cmd
rem ########################################################
rem # main関数呼び出し
rem ########################################################
call :main
goto :eof
rem ########################################################
rem # main関数定義
rem ########################################################
:main
setlocal
echo main start
call :main_sub
echo main end
endlocal
goto :eof
:main_sub
call "%subcmd%" "Isaac Newton"
exit /b 0
goto :eof
batch_function06_sub.cmd
@echo off
rem ########################################################
rem # Say Hello
rem ########################################################
echo Hello %~1%!
これを実行すると以下の結果となり、別ファイルで書いた内容が実行されている事が分かります。
batch_function06_main.cmd実行結果
main start
Hello Isaac Newton!
main end
別ファイルに定義した関数を呼び出す方法
関数を呼び出すにはcallに関数名を渡すのでした。この関数名は正しくはラベルと言います。
callに引数としてラベルを渡すと一旦そこに制御が移り処理が終了するとcallを実行した所に制御が戻ります。
そして実はcall以外にもラベルを使えるコマンドがあります。gotoと言うコマンドですが、callとの違いはcallは処理終了後に元の場所に制御が戻ってくるのに対し、gotoは移動したまま戻ってきません。
これを使ってcallで別ファイルを呼び出した後にgotoで関数(ラベル)を呼び出して処理をする事ができます。下記に例を示します。
batch_function07_main.cmd
@echo off
rem ########################################################
rem # 変数定義
rem ########################################################
set scriptdir=%~d0%~p0
set subcmd=%scriptdir%batch_function07_sub.cmd
rem ########################################################
rem # main関数呼び出し
rem ########################################################
call :main
goto :eof
rem ########################################################
rem # main関数定義
rem ########################################################
:main
setlocal
echo main start
call :main_sub
echo main end
endlocal
goto :eof
:main_sub
set a=5
set b=10
rem # 変数表示
echo a=%a%
echo b=%b%
rem # 足し算
call "%subcmd%" sum %a% %b%
set sum_result=%errorlevel%
echo a+b=%sum_result%
rem # 引き算
call "%subcmd%" diff %a% %b%
set diff_result=%errorlevel%
echo a-b=%diff_result%
exit /b 0
goto :eof
batch_function06_sub.cmd
@echo off
rem ########################################################
rem # 関数呼び出し
rem ########################################################
goto :%~1%
rem ########################################################
rem # sum
rem ########################################################
:sum
setlocal
call :sum_sub %*%
endlocal
exit /b %errorlevel%
goto :eof
:sum_sub
set /a result=%2 + %3
exit /b %result%
goto :eof
rem ########################################################
rem # diff
rem ########################################################
:diff
setlocal
call :diff_sub %*%
endlocal
exit /b %errorlevel%
goto :eof
:diff_sub
set /a result=%2 - %3
exit /b %result%
goto :eof
実行すると以下の結果となり正しく処理が行われているのが確認できます。
batch_function07_main.cmd実行結果
main start
a=5
b=10
a+b=15
a-b=-5
main end
補足説明
上記の方法で別ファイルに定義した関数を呼び出す時に注意があります。通常コマンドライン変数は以下の通りに設定されます。
●%0:バッチファイル自身
●%1:第1引数
●%2:第2引数
●%3:第3引数
:
●%n:第n引数
batch_function06_sub.cmdで第1引数は関数(ラベル)を指定するの使っていますので実際に計算したい数字は第2引数、第3引数になっています。
前回の記事では同じファイルに定義した関数(ラベル)をcallで呼び出す例を紹介しましたが、その場合は直接callに関数(ラベル)を指定しているので引数のずれはなく関数(ラベル)内では第1引数、第2引数を計算対象としています。
前回の記事を読む場合はこちら↓
-
バッチ関数化のススメ~その2~
前回の記事に引き続きバッチで関数を使うためのコツを紹介します。
続きを見る
バッチでロギング
一般的なプログラミング言語だとロギングの機能が備わっているものも多いですが、バッチには簡単に使えるロギング用のコマンドがありません。
そこでここまでに紹介したバッチの関数化を使ってバッチで簡単なログ出力機能を書きましたので次回の記事で紹介したいと思います。
サンプルバッチ
これまで通り紹介したバッチをGitHubにアップロードしているので気になる方はチェックしてみて下さい。