batで、if/forブロックの中で変数を取り扱う場合には注意が必要です。
通常、変数の値の読み出し時は%var%
とします。
しかし、if/forブロック内で新たに
変数の値を変更した場合、これでは期待の値を得ることができません。
この現象の理由はbatではif/forブロック内の処理実行時に、
- ブロックの最後の)までの読み出しを先に一気に行う
- ブロック内の変数値を展開
- ()中のループ処理へと入っていく
といった手続きが取られるためです。
つまり、②の時点の変数の値が採用されるために
ループ内で変数の値を変更しても反映されないのです。
この現象を回避するには遅延環境変数を利用します。
ファイル冒頭へ、
setlocal EnableDelayedExpansion
として、遅延環境変数を有効にした上で
変数の読出時には!var!
とします。
これで②時点での変数読み出しを回避することができます。
@echo off
setlocal EnableDelayedExpansion
for %%a in (*.txt) do (
set name=%%a
echo !name!
)
endlocal
こちらも参照
batについての備忘録