Windowsコマンド虎の巻

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が展開されます。

遅延環境変数を使うパターン

遅延環境変数を使うには、①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:バッチファイルで環境変数のローカル化を終了する