バッチファイルで遅延環境変数の挙動を試してみました。
遅延環境変数とは?
遅延環境変数とは、コマンドプロンプトの機能の一つで変数の展開を遅延させることができる機能です。
通常コマンドプロンプトでは、変数を %変数名% のように定義しますが、このように定義した場合、if 文や for 文の中の処理などで変数を扱う際に想定通りに結果が出力されない場合があります。
そのときに利用するのが遅延環境変数であり、この機能を利用することで if 文や for 文の中の処理で変数を定義し直すことが可能となります。
遅延環境変数は、setlocal enabledelayedexpansion コマンドを記載して遅延環境変数を有効にした上で、変数を !変数名! のように定義します。
今回は実際のコマンドを利用して遅延環境変数を利用しない場合と利用した場合を比較してみます。
遅延環境変数を利用しないでfor文を実行した場合
まず、遅延環境変数を利用しないでfor文を実行します。
今回は、hoge という変数を定義し、それが hogehoge であるときに、hoge の変数を 12345 として出力するコマンドを作成しました。
chcp 65001
@echo off
set hoge=hogehoge
if "%hoge%" == "hogehoge" (
set hoge=12345
echo %hoge%
)
pause
このときの実行結果は以下のようになり、if の処理内で定義した変数(12345)は出力されずに事前に定義した変数の値(hogehoge)が出力されます。
実行結果
上記の結果になる理由
これは、バッチが処理を実行する際に1行単位で変数を展開する仕組みになっているために起きます。
今回のコマンドを例にすると、
if "%hoge%" == "hogehoge" ( set hoge=12345 echo %hoge% )
が1行読み込まれた際に、この1行内における変数がすべて同時に展開されます。
従って、変数が展開された状態は以下の通りとなり、
if "hogehoge" == "hogehoge" ( set hoge=12345 echo "hogehoge" )
想定では if 文の中で変換したかった変数(12345)も、事前に定義した変数(hogehoge)として展開されてしまいます。
遅延環境変数を利用してfor文を実行
次に遅延環境変数を利用してfor文を実行します。
if 文などの中で定義した変数を出力したい場合には遅延環境変数を利用します。
chcp 65001
@echo off
setlocal enabledelayedexpansion
set hoge=hogehoge
if "!hoge!" == "hogehoge" (
set hoge=12345
echo !hoge!
)
pause
上記でも記載している通り、setlocal enabledelayedexpansion コマンドを記載し、
変数を !変数名! のように定義します。
実行結果
実行結果としては以下の通りとなり、if 文の中で定義した 12345 が出力されます。