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
を使用することをおすすめします。