バッチファイルを使用する際、バッチファイル内で行った環境変数の変更が外部に影響を及ぼさないようにすることは非常に重要です。setlocal コマンドは、このような状況で役に立ちます。この記事では、setlocal の基本的な使用方法とその効果について説明します。
setlocalとは?
setlocal コマンドは、現在のバッチファイルでのみ有効な環境変数のスコープを作成します。これにより、バッチファイル内で変数や環境設定の変更を行っても、バッチファイルの実行が完了すると元の状態に戻ります。
setlocalの効果の確認
環境変数をサブのバッチファイルで更新するケースにおいて、setlocalの有無の動作の違いを確認します。
main.bat
@echo off
rem 環境変数をセット
set TEST=メインバッチで設定した値
rem サブバッチファイルを呼び出す
call sub.bat
rem 環境変数を表示
echo %TEST%
pause
setlocalを使用しない場合
サブのバッチファイル内でsetlocalを使用しないで、環境変数の値を変更した場合、上位のmain.batに影響があるかを確認します。
sub.bat
@echo off
rem 環境変数TESTを設定
set TEST=サブバッチで設定した値
実行結果
以下のように、サブで変更した内容はmain.batに影響しました。
サブバッチで設定した値
続行するには何かキーを押してください . . .
setlocalを使用する場合
次に、サブのバッチファイル内でsetlocalを使用して環境変数の値を変更した場合、上位のmain.batに影響があるかを確認します。
sub.bat
@echo off
setlocal
rem 環境変数TESTを設定
set TEST=サブバッチで設定した値
endlocal
実行結果
結果は、以下のようにサブが変更した内容は、メインに影響しませんでした。
メインバッチで設定した値
続行するには何かキーを押してください . . .
setlocalを使用しない場合の影響範囲
環境変数は、同一プロセス内で実行される他のバッチファイルと共有しています。このため、setlocal コマンドを使用しない場合、バッチファイルが変更した環境変数は、同一プロセス内で実行される他のバッチファイルに影響を与えることになります。
なお、環境変数は、プロセスが生成される際に、親プロセスからコピーされるので、setlocalを使用しなかったとしても、setコマンドによる環境変数の変更が、直接親プロセスやWindows環境に影響を与えることはありません。
このように書くと、たとえばダブルクリックにより実行する単独のバッチファイルについては、setlocalを使用しなくても良さそうですが、将来そのバッチファイルが他のバッチファイルからcallされるようなケースも考えられますので、作法としてsetlocalとendlocalを書いておくことは有益であると考えられます。
まとめ
本記事では、setlocal の基本的な使用方法とそのメリットについて説明しました。バッチファイルにsetlocalとendlocalを含めることは、ポータビリティやメンテナンス性を高める上で非常に有益です。そのため、これらのコマンドを積極的に使用することを推奨します。