バッチファイルの変数ではまったので書き留めておく。
for文とif文の中では変数の処理のされ方が異なる。
以下のように書くと変数のnumに思ったように値が入らない。
===================ここから===================
@echo off
rem 変数のテスト
set /a num=0
for %%i in (*.txt) do (
set /a num=num+1
echo count:%num%
)
echo count:%num%
===================ここまで===================
フォルダ内のテキストファイルをカウントするバッチとなっているが、
実行結果は以下となる。
for文の中ではnum変数のカウントアップがされていないことが分かる。
これはdosの仕様上、for文の中は1行として処理されるため。
つまりfor文の1行前までにセットされていたnumの値がエコーされている。
従って、for文を抜けると正しくカウントアップされた結果が表示される。
この場合「setlocal ENABLEDELAYEDEXPANSION」を宣言することで
回避できる。ちなみにこれを利用する場合は変数の宣言時は%ではなく
!でくくる必要がある
===================ここから===================
@echo off
setlocal ENABLEDELAYEDEXPANSION
rem 変数のテスト
set /a num=0
for %%i in (*.txt) do (
set /a num=num+1
echo count:!num!
)
echo count:%num%
===================ここまで===================
実行結果は以下。
これで正しくカウントされる。
ちなみにerrorlevelを使ったエラーの判定を行う場合も同様に、
この処理で遅延環境変数の遅延部分を制御できる。