プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Windows、バッチファイル(.bat)のfor文の中で数値をインクリメントする
結論から書くと、遅延環境変数の展開を使って

@echo off

setlocal enabledelayedexpansion

set num=0

for /L %%i in (1, 1, 10) do (
    set /a num=num+1
    echo !num!
)

pause

でいけますよ。

それでは、詳細を書いていきます。

お客さま先の新人さんから

バッチファイルを作ってるんですけど、for文の中でインクリメントできません(つд`)

と泣きが入りました。

コードを見せてもらうと、こんな感じですφ(--)

@echo off

set num=0

for /L %%i in (1, 1, 10) do (
    set /a num=num+1
    echo %num%
)

pause

ちなみに、一部の処理を抜粋しています。
新人さんが実際に書いていたコードはもう少し複雑でした。

それにしても新人さんの書いたこのコード、一見するとおかしそうなところは無いですね……。
と言ってあげたいのですが、あぁ、こりゃー駄目っすね(^^;

バッチファイルにおける環境変数は、コードの読み込み時に値に置き換えられます。
だから「for ~ ( ~ )」の行を読み込んだ時点で「%num%」は「0」に置き換わるのです。

つまり新人さんが書いたコードは、実質これと同じφ(--)

@echo off

set num=0

for /L %%i in (1, 1, 10) do (
    set /a num=num+1
    echo 0
)

pause

そりゃー、延々「0」が出力されますわ(ノ∀`)

これを何とかするためには、変数が値に置き換えられるタイミングを
コードの「読み込み時」から「実行時」に変えてあげなくてはいけません。

そこで登場するのが「遅延環境変数の展開」です。

言葉は難しそうな響きですが、大したことはありません。
単に「変数の展開を読み込み時じゃなくて実行時にしてけろ!」な指定なだけです。

実際に遅延環境変数の展開を行うには「setlocal」に「enabledelayedexpansion」を指定しておいて、
変数の参照時にはパーセント(%)ではなくエクスクラメーションマーク(!)で囲みます。

つまり、コードの上の方に

setlocal enabledelayedexpansion

と書いておいて、変数の中身を参照する際には

echo !num!

と書けば、読み込み時ではなく実行時に値に置き換えられます。

それを踏まえて、新人さんの書いたコードをこんな感じに変更するとφ(--)

@echo off

setlocal enabledelayedexpansion

set num=0

for /L %%i in (1, 1, 10) do (
    set /a num=num+1
    echo !num!
)

pause

無事に、forループの中で数値がインクリメントされるようになりました。

完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:コマンド/バッチ  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事