Y子です。
昨日は 大長編 を書いてしまったので、簡潔スッキリ版も書いてみます。内容はだいたい同じです。
概要
「環境遅延変数」を使うべき例と、使い方をご紹介します。
うまく使わないと、if
文やfor
文の変数の値が、期待通りになりません。
コード
よくある失敗例
「str_a
にbbb
を格納したが、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
文でも同じ対策が有効です。
おわりに
遅延環境変数を、なるべく少ない文章量で説明してみました。
わかりやすくなってるとよいのですが。
ではまた!