PR

【バッチ】遅延環境変数展開(enabledelayedexpansion)を1分でわかりやすく解説

Command

遅延環境変数展開:「enabledelayedexpansion」コマンドは、バッチファイル内で変数の遅延展開を有効にするために使用されるコマンドです。

この機能を利用することで、ループ内などで変数の値を動的に更新し、その更新された値をリアルタイムで参照する際に特に役立ちます。

参考 コマンドプロンプトとは?

通常、コマンドプロンプトでは変数はバッチファイルが読み込まれる時点で展開されますが、「setlocal enabledelayedexpansion」を使用すると、変数はコマンドが実行されるタイミングで展開されるようになります。

用語 展開

スクリプトやプログラミングにおいて、「展開」とは、変数や式がその実際の値または結果に置き換わるプロセスのこと。例えば、変数に格納された数値や文字列が、スクリプトの実行時にその変数を参照する場所でその具体的な内容に置き換えられることを指します。

このページではコマンドプロンプトにおける変数の取り扱いと、setlocal enabledelayedexpansionの役割について初心者向けにわかりやすく簡潔にご説明します。

このページで学べる内容
  • コマンドプロンプトにおける「変数」の取り扱い
    • 通常の変数の取り扱い
    • 遅延展開された変数の取り扱い
  • setlocal enabledelayedexpansion を利用したサンプルコード
    • 遅延展開を利用する際の注意点

システムエンジニアやプログラマーであれば知らないと恥ずかしい基本知識です。是非最後までご覧ください。

スポンサーリンク

setlocal enabledelayedexpansion とは?

「setlocal enabledelayedexpansion」コマンドは、変数の展開方法を変更するために使用されます。

基本的に、コマンドプロンプトでは変数はその場で展開されますが「setlocal enabledelayedexpansion」を使用すると、変数はコマンドが実行されるタイミングで展開されるようになります。

↑の説明だけではなかなかピンと来ない方もいるかと思いますので、setlocal enabledelayedexpansion を利用する場合/利用しない場合、それぞれに分けてご説明いたします。

通常の変数の取り扱い

通常、バッチファイルで変数は %変数名% の形で使用され、この場合の変数はバッチファイルが読み込まれる時点での値に置き換えられます。

例えば↓のコードでは、最初に VAR1 が代入され、その後 2 に変更されますが、両方の echo コマンドは同じ値 1 を出力します。

@echo off
set VAR=1
echo %VAR%
set VAR=2
echo %VAR%

Delayed Expansionの使用

setlocal enabledelayedexpansion を使用すると、変数は !変数名! の形で記述され、コマンドが実行されるタイミングで変数が展開されます。

↓のコードでは、VAR に最初に 1 が代入され、次に 2 が代入されます。echo コマンドは、それぞれの行で VAR の現在の値(12)を出力します。

@echo off
setlocal enabledelayedexpansion
set VAR=1
echo !VAR!
set VAR=2
echo !VAR!

ループや条件分岐など、複雑なコードを書く際には変数の値が動的に変更されることが多くあります。

コマンドプロンプトにおける通常の変数展開では、ループ内で変数の値を更新しても、その変更が反映されません。しかし、遅延環境変数:Delayed Expansionを使用すると、ループの各ステップで変数の現在の値を取得することができるため、より複雑なスクリプトを効果的に記述することが可能になります。

まとめ 通常の変数展開 vs 遅延展開

通常の変数展開

  • 方法: %変数名% の形式を使用。
  • タイミング: バッチファイルが読み込まれる時点で変数が展開される。
  • 特徴: ループや条件分岐内で変数の値を変更しても、それ以降のコマンドには反映されない。

遅延展開(Delayed Expansion)

  • 方法: !変数名! の形式を使用。setlocal enabledelayedexpansion コマンドで有効化が必要。
  • タイミング: コマンドが実行されるタイミングで変数が展開される。
  • 特徴: ループや条件分岐内で変数の値が変更された場合、その変更が直ちに反映される。

遅延展開を使用することで、変数の動的な変更をスクリプト内で直接反映させることができ、これによりループ処理や複雑な条件分岐を扱う際に非常に役立ちます。特に、変数の値が頻繁に変更されるような場合には、遅延展開の使用が推奨されます。

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 :setlocalendlocalの間で行われた変更は、スクリプトの外に影響しません。

@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を定義し、setlocalendlocalの内外でその値を表示します。endlocalの後では変数localVarは未定義になります。

まとめ 遅延環境変数展開とは?

  1. 基本
    • 遅延環境変数展開は、Windowsのコマンドプロンプト(CMD)やバッチファイルで使用される機能です。この機能により、変数の値がコマンドが実行される時点で「遅延して」展開されます。
  2. 通常の変数展開との違い
    • 通常、バッチファイル内の変数はその行が解析される際に一度だけ展開されます。しかし、遅延環境変数展開を使うと、変数はその行が実行されるたびに展開されます。
  3. ループ処理での利点
    • 特にループ内で変数の値が変更される場合に有効です。通常の変数展開では、ループの開始時に変数が一度だけ展開されるため、ループ内での変数の変更が反映されません。遅延展開を使うと、ループの各ステップで変数の最新の値が使用されます。
  4. 記法
    • 遅延環境変数展開が有効な場合、変数は %variable% の代わりに !variable! という形式で参照されます。
  5. 有効化方法
    • この機能を使用するためには、コマンドプロンプトやバッチファイルの先頭で setlocal enabledelayedexpansion コマンドを使用して遅延展開を有効にする必要があります。

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
CommandIT-Skills
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました