遅延環境変数展開:「enabledelayedexpansion」コマンドは、バッチファイル内で変数の遅延展開を有効にするために使用されるコマンドです。
この機能を利用することで、ループ内などで変数の値を動的に更新し、その更新された値をリアルタイムで参照する際に特に役立ちます。
参考 コマンドプロンプトとは?
通常、コマンドプロンプトでは変数はバッチファイルが読み込まれる時点で展開されますが、「setlocal enabledelayedexpansion」を使用すると、変数はコマンドが実行されるタイミングで展開されるようになります。
このページではコマンドプロンプトにおける変数の取り扱いと、setlocal enabledelayedexpansionの役割について初心者向けにわかりやすく簡潔にご説明します。
システムエンジニアやプログラマーであれば知らないと恥ずかしい基本知識です。是非最後までご覧ください。
setlocal enabledelayedexpansion とは?
「setlocal enabledelayedexpansion」コマンドは、変数の展開方法を変更するために使用されます。
基本的に、コマンドプロンプトでは変数はその場で展開されますが「setlocal enabledelayedexpansion」を使用すると、変数はコマンドが実行されるタイミングで展開されるようになります。
↑の説明だけではなかなかピンと来ない方もいるかと思いますので、setlocal enabledelayedexpansion を利用する場合/利用しない場合、それぞれに分けてご説明いたします。
通常の変数の取り扱い
通常、バッチファイルで変数は %変数名%
の形で使用され、この場合の変数はバッチファイルが読み込まれる時点での値に置き換えられます。
例えば↓のコードでは、最初に VAR
に 1
が代入され、その後 2
に変更されますが、両方の echo
コマンドは同じ値 1
を出力します。
@echo off set VAR=1 echo %VAR% set VAR=2 echo %VAR%
Delayed Expansionの使用
setlocal enabledelayedexpansion
を使用すると、変数は !変数名!
の形で記述され、コマンドが実行されるタイミングで変数が展開されます。
↓のコードでは、VAR
に最初に 1
が代入され、次に 2
が代入されます。echo
コマンドは、それぞれの行で VAR
の現在の値(1
と 2
)を出力します。
@echo off setlocal enabledelayedexpansion set VAR=1 echo !VAR! set VAR=2 echo !VAR!
ループや条件分岐など、複雑なコードを書く際には変数の値が動的に変更されることが多くあります。
コマンドプロンプトにおける通常の変数展開では、ループ内で変数の値を更新しても、その変更が反映されません。しかし、遅延環境変数:Delayed Expansionを使用すると、ループの各ステップで変数の現在の値を取得することができるため、より複雑なスクリプトを効果的に記述することが可能になります。
setlocal enabledelayedexpansion (遅延展開)の注意点
遅延展開の基本を押さえたうえで、初心者でも気を付けておきたい setlocal enabledelayedexpansion の罠について押さえておきましょう。
1. 遅延展開を使った変数の更新
注意点1 :ループ内で変数の値を更新する際、通常の%変数名%
ではなく、遅延展開を用いた!変数名!
を使用すること。
@echo off setlocal enabledelayedexpansion rem このスクリプトはループ内の遅延展開を示します set /a count=0 for /l %%i in (1,1,5) do ( set /a count=!count! + 1 echo Count: !count! rem 期待される出力: カウントはループの各反復で1から5まで増加します ) endlocal rem 実行結果 rem Count: 1 rem Count: 2 rem Count: 3 rem Count: 4 rem Count: 5
↑のコードでは、for
ループを使用して5回繰り返します。ループの各反復で、count
変数をインクリメントし、その値を!count!
を使って表示します。
2. ローカル環境の使用
注意点2 :setlocal
とendlocal
の間で行われた変更は、スクリプトの外に影響しません。
@echo off setlocal enabledelayedexpansion rem このスクリプトはsetlocalとendlocalの間の変数の局所的スコープを示します set "localVar=Local Value" echo Inside local: !localVar! rem 期待される出力: 局所的内部: Local Value endlocal echo Outside local: %localVar% rem 期待される出力: 局所的外部: %localVar% (またはlocalVarがグローバルに定義されていない場合は空白)
↑のスクリプトでは、ローカル変数localVar
を定義し、setlocal
とendlocal
の内外でその値を表示します。endlocal
の後では変数localVar
は未定義になります。