setlocal, endlocal
コマンドプロンプトやバッチファイルで変数を使用したい場合、setコマンドを指定して特定の変数名に値を設定することができます。
しかし、そのままsetコマンドを使用すると、変数はグローバル変数として扱われます。
バッチファイルの実行が完了した後も変数が残ってしまうため、他のバッチファイルやコマンドプロンプトで同じ変数名を使用すると、予期しない結果が発生する可能性があります。
そういったことが起こらないようにするために、setlocal、endlocalコマンドを使用することで、変数を使用できる範囲を限定することができます。
setlocal, endlocal コマンドの使い方
setlocal, endlocal を使わなかった場合
例として、caller.cmd、callee.cmd という 2 つのバッチファイルを、それぞれ以下のように作成します。
@echo off
set VAR=Hello
call callee.cmd
@echo off
echo %VAR%
上記の caller.cmd を実行すると、callee.cmd が実行され、callee.cmd 内でecho %VAR%が実行されます。
setlocal、endlocalを使用していないため、定義した変数VARはグローバル変数として扱われます。
そのため、callee.cmd からも参照することができ、Helloという文字列が出力されます。
setlocal, endlocal を使った場合
次に、先ほど作成した caller.cmd、callee.cmd を以下のように修正します。
@echo off
setlocal
set VAR=Hello
endlocal
call callee.cmd
@echo off
echo %VAR%
caller.cmd にsetlocal、endlocalを追加し、callee.cmd に変更はありません。
上記の caller.cmd を実行すると、callee.cmd が実行され、callee.cmd 内でecho %VAR%が実行されます。
しかし、setlocal、endlocalを使用したため、callee.cmd 内でecho %VAR%を実行しても、VARという変数は存在しないため、何も出力されません。
実際に実行してみると、以下のようになります。
このように、setlocal、endlocalを使用することで、変数を使用できる範囲を限定することができます。
意図しない変数の参照を防ぐために、バッチファイルを作成する際には、setlocal、endlocalを使用することをおすすめします。