バッチファイルの遅延環境変数(簡単な例)


Y子です。

昨日は大長編を書いてしまったので、簡潔スッキリ版も書いてみます。内容はだいたい同じです。

概要

「環境遅延変数」を使うべき例と、使い方をご紹介します。
うまく使わないと、if文やfor文の変数の値が、期待通りになりません。

コード

よくある失敗例

str_abbbを格納したが、echoで出力したらbbbにならないことがある」という例です。
(1)~(6)の順に、説明をお読みください。

delayedexpansion_sample_ng.bat
@echo off
set str_a=aaa
if 1==1 (       (1)if文中の %a% 形式の変数の値は、if文に入った時点の値に固定されるので、
  set str_a=bbb    (4)ここで格納した「bbb」が %str_a% で取得できるのは、if文を出た後です。
  echo %str_a%    (2)ここ(if文中)の %str_a% の値は、(1)時点の「aaa」です。
)
echo %str_a%     (5)if文を出た後なので、(4)で格納した「bbb」が取得できます。
実行結果
aaa          (3)「aaa」です。 ……(2)で書いた通り
bbb          (6)「bbb」です。 ……(5)で書いた通り

if文を例にしましたが、for文でも同じことが起きます。

改善例

前項から2か所修正しました。
・最初にsetlocal enabledelayedexpansion宣言を追加
echo出力に!str_a!を追加
(1)~(7)の順に、説明をお読みください。

delayedexpansion_sample_ok.bat
@echo off

rem 遅延環境変数の展開を有効にする
setlocal enabledelayedexpansion (1)これを書くと、 !a! 形式の変数が使えるようになります。

set str_a=aaa
if 1==1 (         (2)if文に入ると、 %str_a% は固定ですが、 !str_a! は格納した値。
  set str_a=bbb     (3)%str_a% は「aaa」のままですが、!str_a! は「bbb」に変わります。
  echo %str_a% !str_a! (4)if文中なので、%str_a%は(2)時点の値、!str_a!は(3)で格納した値。
)
echo %str_a% !str_a!  (6)if文を出た後なので、(3)で格納した「bbb」が %str_a% でも取得できます。
実行結果
aaa bbb         (5)「aaa bbb」です。 ……(3)(4)で書いた通り
bbb bbb         (7)「bbb bbb」です。 ……(6)で書いた通り

if文を例にしましたが、for文でも同じ対策が有効です。

おわりに

遅延環境変数を、なるべく少ない文章量で説明してみました。
わかりやすくなってるとよいのですが。

ではまた!