バッチファイルのfor文やif文の変数 | IT土方のReminder

IT土方のReminder

英語なんて全く出来ないくせに気が付いたら外資系IT企業のサポートエンジニアになっていた人のブログ。このブログに書いてある事は間違っている可能性もあるので気づいた人が指摘してくれても良いし、指摘しなくても良い。

テーマ:

バッチファイルの変数ではまったので書き留めておく。
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%
===================ここまで===================

フォルダ内のテキストファイルをカウントするバッチとなっているが、
実行結果は以下となる。

IT土方のReminder


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%
===================ここまで===================

実行結果は以下。


IT土方のReminder

これで正しくカウントされる。


ちなみにerrorlevelを使ったエラーの判定を行う場合も同様に、

この処理で遅延環境変数の遅延部分を制御できる。