setlocal, endlocal

にメンテナンス済み

コマンドプロンプトやバッチファイルで変数を使用したい場合、setコマンドを指定して特定の変数名に値を設定することができます。

しかし、そのままsetコマンドを使用すると、変数はグローバル変数として扱われます。

バッチファイルの実行が完了した後も変数が残ってしまうため、他のバッチファイルやコマンドプロンプトで同じ変数名を使用すると、予期しない結果が発生する可能性があります。

そういったことが起こらないようにするために、setlocalendlocalコマンドを使用することで、変数を使用できる範囲を限定することができます。

setlocal, endlocal コマンドの使い方

setlocal, endlocal を使わなかった場合

例として、caller.cmd、callee.cmd という 2 つのバッチファイルを、それぞれ以下のように作成します。

caller.cmd
@echo off

set VAR=Hello

call callee.cmd
callee.cmd
@echo off

echo %VAR%

上記の caller.cmd を実行すると、callee.cmd が実行され、callee.cmd 内でecho %VAR%が実行されます。

setlocalendlocalを使用していないため、定義した変数VARはグローバル変数として扱われます。

そのため、callee.cmd からも参照することができ、Helloという文字列が出力されます。

×
コマンド プロンプトのアイコン
コマンド プロンプト
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2024 Ribbit App Development All rights reserved.
 
C:\users\user>caller.cmd
Hello

setlocal, endlocal を使った場合

次に、先ほど作成した caller.cmd、callee.cmd を以下のように修正します。

caller.cmd
@echo off

setlocal

set VAR=Hello

endlocal

call callee.cmd
callee.cmd
@echo off

echo %VAR%

caller.cmd にsetlocalendlocalを追加し、callee.cmd に変更はありません。

上記の caller.cmd を実行すると、callee.cmd が実行され、callee.cmd 内でecho %VAR%が実行されます。

しかし、setlocalendlocalを使用したため、callee.cmd 内でecho %VAR%を実行しても、VARという変数は存在しないため、何も出力されません。

実際に実行してみると、以下のようになります。

×
コマンド プロンプトのアイコン
コマンド プロンプト
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2024 Ribbit App Development All rights reserved.
 
C:\users\user>caller.cmd
ECHO は <OFF> です。

このように、setlocalendlocalを使用することで、変数を使用できる範囲を限定することができます。

意図しない変数の参照を防ぐために、バッチファイルを作成する際には、setlocalendlocalを使用することをおすすめします。

練習問題

以下のコードを実行した場合、コマンドプロンプトに出力される結果として正しいものはどれか

@echo off
set VAR=FirstValue

setlocal

set VAR=SecondValue

endlocal

echo %VAR%
#コマンドプロンプト #バッチファイル #引数 #コマンドライン #コマンド