setlocal
setlocalは、バッチファイルで環境変数のローカル化を開始するコマンドです。
解説
setlocal~endlocal内で定義した環境変数は、それ以外の場所の環境変数に影響を及ぼしません。
構文
- (構文)
- SETLOCAL SETLOCAL /?
オプション | 説明 |
---|---|
/? | コマンドのヘルプを表示する |
サンプル
環境変数のローカル化が分かるサンプル
(sample1.bat)
@echo off
rem setlocal前にa=123を定義
set a=123
echo %a%
rem 環境変数のローカル化開始
setlocal
rem setlocal後にa=999を定義
set a=999
echo %a%
rem 環境変数のローカル化終了
endlocal
rem 変数aを表示
echo %a%
(実行結果)
C:¥>sample1.bat
123
999
123
ローカル化中に定義した値(999)は、ローカル化の外には影響しないことが分かります。
遅延環境変数
遅延環境変数を使うと変数を読み込むタイミングを変更することができます。
変数に設定された値を読み込むタイミングは、通常は変数が存在する行へ処理が移ったタイミングですが、遅延環境変数を使うと変数を参照するタイミングとなります。
遅延環境変数を使わないパターン
(sample2.bat)
@echo off
set val=0
if %val% == 0 (
set /a val += 1
echo %val%
)
(実行結果)
C:¥>sample2.bat
0
結果は0です。1となりそうな感じがしますが、ifの行が読み込まれた時点で変数valの値は確定するので結果は0となってしまいます。
通常の変数の値が展開されるのは、変数が出現した行に処理が入った時です。但し、括弧で囲われた中の変数は一括で展開されます。
(上記の例でいえば、ifの行に処理が移った時に5行目~8行目が展開されます)
ただし計算自体は行われるので、8行目を過ぎた後であれば %val%には1が展開されます。
(上記の例でいえば、ifの行に処理が移った時に5行目~8行目が展開されます)
ただし計算自体は行われるので、8行目を過ぎた後であれば %val%には1が展開されます。
遅延環境変数を使うパターン
遅延環境変数を使うには、①setlocal enabledelayedexpansion で宣言し、
②変数名を通常の %(パーセント)ではなく !(びっくりマーク)で囲います。
(sample3.bat)
@echo off
:遅延環境変数を使用する宣言
setlocal enabledelayedexpansion
set val=0
if %val% == 0 (
set /a val += 1
echo !val!
)
(実行結果)
C:¥>sample3.bat
1
これで結果は想定通りの1となります。
備考
- ローカル化を終了するには endlocalコマンドで終了できます。
(バッチファイルが終了した時も、暗黙的にendlocalが実行されます)
関連項目
- endlocal:バッチファイルで環境変数のローカル化を終了する