Windows のコマンドプロンプト(バッチファイル)で使用可能な FOR ループの構文は以下のようになっています。
FOR 反復変数 IN (集合) DO コマンド
反復変数
の部分には、集合
の要素を順次取り出して処理するための変数を宣言します。%%a
~ %%z
、および、%%A
~ %%Z
が使用でき、大文字と小文字は区別されます。
バッチファイル内では、%%A
のようにパーセント記号を 2 つ使用しますが、コマンドプロンプトから直接入力する場合は、%A
のようにパーセント記号は 1 つにする必要があります。
集合
の部分には、ループで処理したいファイルやディレクトリの集合、数値の範囲などを指定します(指定方法は後述)。
コマンド
の部分には、繰り返し実行される処理を記述します。この中で反復変数を参照することで、各要素ごとの処理を行います。パイプや括弧を使ったグループ化により、複数のコマンドを記述することができます。
ループ内で複数のコマンドを実行したい場合は、次のように括弧でコマンド群を囲みます。 複数行に分けて記述できるので読みやすいです。
FOR 反復変数 IN (集合) DO (
コマンド1
コマンド2
コマンド3
)
FOR コマンドに /L
オプションを使用すると、指定した数値の範囲、ステップでループ処理を行うことができます。
集合
の部分には、開始の値、ステップ、終了の値をカンマで区切って指定します。
@echo off
FOR /L %%A IN (0, 1, 3) DO echo %%A
0
1
2
3
ステップには、負の数値を指定することもできます。
FOR /L %%A IN (6, -3, 0) DO echo %%A
6
3
0
FOR コマンドをオプションなしで実行する場合、集合
にはファイル集合(あるいは単なるテキスト)を指定するものとみなされます。
ファイル名そのものを指定したり、ワイルドカードを使用した指定を行えます。
FOR %%A IN (*) DO echo %%A
FOR %%A IN (*.txt) DO echo %%A
ファイル集合は、スペースで区切って複数指定することができます。
FOR %%A IN (*.cpp *.h) DO echo %%A
ファイル集合をループで処理するときに、/R
オプションを指定すると、指定されたディレクトリ内のファイルを再帰的に検索してくれます。
FOR /R . %%A IN (*) DO echo %%A
集合
部分に、スペースで区切られた文字列リテラルが指定された場合、単純にそれらのテキストが順に処理されます(同名のファイルが存在するかどうかは関係ありません)。
FOR %%A IN (aaa bbb ccc) DO echo %%A
FOR コマンドで、ディレクトリの集合をループ処理したい場合は、/D
オプションを使用します。
主な使用方法は、ファイル集合に対するループと同様です。
FOR /D %%A IN (*) DO echo %%A
FOR /R . /D %%A IN (*) DO echo %%A
コマンド
部分に FOR コマンドを指定すれば、FOR コマンドを 2 つ組み合わせて使用することができます。
@echo off
FOR %%A IN (aaa bbb ccc) DO (FOR %%B IN (%%A\*.txt) DO echo %%B)
aaa\1.txt
aaa\2.txt
bbb\1.txt
bbb\2.txt
ccc\1.txt
集合
の部分に変数を指定すれば、変数内の値をループで処理することができます。
@echo off
setlocal
set VALUE=aaa,bbb,ccc
FOR %%A IN (%VALUE%) DO echo %%A
aaa
bbb
ccc