まくまくWindowsノート
バッチファイルの FOR ループ (1) 数値、ファイル集合、ディレクトリ集合のループ処理
2019-12-04

FOR ループの構文

Windows のコマンドプロンプト(バッチファイル)で使用可能な FOR ループの構文は以下のようになっています。

FOR 反復変数 IN (集合) DO コマンド

反復変数

反復変数 の部分には、集合 の要素を順次取り出して処理するための変数を宣言します。%%a%%z、および、%%A%%Z が使用でき、大文字と小文字は区別されます。 バッチファイル内では、%%A のようにパーセント記号を 2 つ使用しますが、コマンドプロンプトから直接入力する場合は、%A のようにパーセント記号は 1 つにする必要があります。

集合

集合 の部分には、ループで処理したいファイルやディレクトリの集合、数値の範囲などを指定します(指定方法は後述)。

コマンド

コマンド の部分には、繰り返し実行される処理を記述します。この中で反復変数を参照することで、各要素ごとの処理を行います。パイプや括弧を使ったグループ化により、複数のコマンドを記述することができます。

ループ内で複数のコマンドを実行したい場合は、次のように括弧でコマンド群を囲みます。 複数行に分けて記述できるので読みやすいです。

FOR 反復変数 IN (集合) DO (
    コマンド1
    コマンド2
    コマンド3
)

FOR ループの具体的な使用方法

数値のループ処理

FOR コマンドに /L オプションを使用すると、指定した数値の範囲、ステップでループ処理を行うことができます。 集合 の部分には、開始の値、ステップ、終了の値をカンマで区切って指定します。

例: 0 から 3 までステップ 1 でループ

@echo off
FOR /L %%A IN (0, 1, 3) DO echo %%A

実行結果

0
1
2
3

ステップには、負の数値を指定することもできます。

例: 6 から 0 までステップ -3 でループ

FOR /L %%A IN (6, -3, 0) DO echo %%A

実行結果

6
3
0

ファイル集合、文字列リテラルに対するループ

FOR コマンドをオプションなしで実行する場合、集合 にはファイル集合(あるいは単なるテキスト)を指定するものとみなされます。 ファイル名そのものを指定したり、ワイルドカードを使用した指定を行えます。

例: カレントディレクトリ内のファイルをすべて処理(ディレクトリは除く)

FOR %%A IN (*) DO echo %%A

例: カレントディレクトリ内の拡張子 .txt を持つファイルをすべて処理

FOR %%A IN (*.txt) DO echo %%A

ファイル集合は、スペースで区切って複数指定することができます。

例: カレントディレクトリ内の拡張子 .cpp .h を持つファイルをすべて処理

FOR %%A IN (*.cpp *.h) DO echo %%A

ファイル集合をループで処理するときに、/R オプションを指定すると、指定されたディレクトリ内のファイルを再帰的に検索してくれます。

例: カレントディレクトリ以下のファイルを再帰的に検索

FOR /R . %%A IN (*) DO echo %%A

集合 部分に、スペースで区切られた文字列リテラルが指定された場合、単純にそれらのテキストが順に処理されます(同名のファイルが存在するかどうかは関係ありません)。

例: aaa、bbb、ccc を順番に処理

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 つ組み合わせて使用することができます。

例: aaa、bbb、ccc ディレクトリ以下の .txt ファイルを列挙

@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

集合 の部分に変数を指定すれば、変数内の値をループで処理することができます。

例: 変数 VALUE 内の値をループで処理

@echo off
setlocal
set VALUE=aaa,bbb,ccc
FOR %%A IN (%VALUE%) DO echo %%A

実行結果

aaa
bbb
ccc

参考

2019-12-04