やりたいこと検索

forループの中で値を変化させる

 

目次

 

for文の中で値を変化させる

for文の中で値を変化させたい場合はfor文全体を、「setlocal enabledelayedexpansion」と「endlocal」で挟みます。また、for文内で使用する変数は「%」ではなく「!」で囲みます

 

以下の例は「for」を使って変数「sum」に1から10までを足していくプログラム「for_sum.bat」です。

3行目と11行目に「setlocal」コマンドを記述してfor文を囲んでいます。また、for文の中の変数「sum」は「!」を使って囲っている点に注目です。

以下が実行結果です。

forループの中で値を変化させる 1~10まで足す

よくある間違いとして、「setlocal enabledelayedexpansion」を書き忘れたり、「!」ではなく「%」で囲んだりするとうまくいきません。

 

「enabledelayedexpansion」とは

「enabledelayedexpansion」は「遅延環境変数の展開」と呼ばれるものです。聞きなれない言葉ですが、そんなに難しいことではありません。「遅延環境変数の展開」について詳しく説明していきましょう。

まず、「環境変数」とは、前節のプログラムでいう「sum」のような変数のことです。「環境変数」=「変数」と思ってもかまいません。

次に、「環境変数の展開」とは、変数の値を代入することです。前節のプログラムの「set sum=0」や「set /a sum=!sum!+%%n」の部分です。

「遅延」は遅らせることですので、「遅延環境変数の展開」とは「変数に値が代入されるのを遅延させる(遅らせる)」という意味になります。では、これは一体どうゆうことでしょう。

以下のプログラムを考えます。

これを実行すると、3回の名前の表示はどうなるでしょうか。「if」文の中の変数「途中の名前」は直前の7行目で変数「name」に「yamada」を代入しているので、3度の名前の表示は、

始めの名前=tanaka
途中の名前=yamada
最後の名前=yamada

となって欲しいですが、実行結果は以下の通りです。

forループの中で値を変化させる 変数代入のタイミング確認(その1)

「途中の名前」が「tanaka」となってしまっています。

この原因は、バッチプログラムの「if」文全体は全ての行が同時に読み込まれるためです。つまり、6行目の「if」コマンドが実行されるのと同時に「if」文内のプログラムがすべて同時に読み込まれるということは、7行目の変化を反映しないまま、8行目の代入を行ってしまうのです。この時点では、「%name%」には「tanaka」が入っていますので「途中の名前」には「tanaka」が入っていたのです。

つまり、上記のプログラムは、

と同意であり、8行目には「tanaka」が使用されています。

これを防ぐのが、「enabledelayedexpansion」です。「enabledelayedexpansion」は「遅延環境変数の展開」であり、「変数に値が代入されるのが遅延させる(遅らせる)」という意味でした。すなわち、同時に変数を代入するのではなく、変数の代入をコマンドを一行ずつ読み込んでいく時に遅らせるのです。

すると、「echo 途中の名前=%name%」の「%name%」部分はその直前の「set name=yamada」を読み込んだ後に置き換えられるため、変更後の名前が出力されます。

以下、「enabledelayedexpansion」を追加して修正したプログラムです。

以下実行結果です。

forループの中で値を変化させる 変数代入のタイミング確認(遅延後)

思い通りの結果が得られました。

「%」ではなく「!」を使用していることに注意しましょう。

Windowsバッチファイル初心者へ向けた入門書を作成しました


Windowsバッチファイル初心者の方へ向けた入門書(PDF)を作成しました。


・初めてWindowsバッチファイルを勉強してみようと思っている方

・使ったことはあるが一から基礎を学び直したい方


へ向けて丁寧な解説を行っています。


「全くプログラムを知らない方でも、この入門書を読んだ後には、Windowsバッチファイルの中級者レベルになれるように」をコンセプトに執筆したものです。


この本を読めば、バッチファイルを使ったファイルやフォルダの操作に関しては一通りのことができるようになります。そうなればもう十分中級者と呼べるレベルですので、あとは自分のやりたいことを実現しようとする中で徐々に知識を蓄えていくだけですぐに上級者へなれるでしょう。


詳しくみる

関連ページ

コメント

  1. ヒメ より:

    すごく助かりました。
    ありがとうございます。

コメントを残す