大量のファイルを処理する

前回、コマンドを用いてファイルやディレクトリを操作する方法を説明しましたが、多くの場合、バッチファイルの処理で期待するのは個々のファイル処理ではなく、人の手では面倒な大量のファイルの処理でしょう。たとえば、ファイル名を一定の規則で並べ変えたり、拡張子を変換するといった目的が考えられます。

こうした、複数の対象に対して同一のコマンドを連続的に実行するにはforコマンドを使います。forコマンドは、指定した複数のファイルや値、文字列を順にコマンドで処理します。

for %変数 in (セット) do コマンド
for %%変数 in (セット) do コマンド

forコマンド名の直後の % 記号に続く変数は、連続する処理で現在の処理対象となっている文字列を格納します。この変数をコマンドで利用することで、大量のファイルなどを順に同じコマンドを用いて処理できます。forコマンドで用いる変数の概念は、環境変数と基本的に同じです。ただし、ここで使用する変数名には 1 文字のアルファベットしか指定できません。変数名は大文字と小文字を区別するので %%a と %%A は異なる変数となります。

変数名の前の % 記号の数は、コマンドで実行するかバッチファイルで処理するかで異なります。コマンドプロンプトで for コマンドを直接打ち込んで実行する場合は "%変数" を用います。バッチファイル内で実行する場合は "%%変数" と記述してください。

in キーワードの直後の括弧 ( ) 内に書かれるセットには、forコマンドで処理する対象を表す文字列を指定します。半角で区切ることによって、セットに複数の値を指定できます。forコマンドは、セットに指定されたファイルや文字列を順に doキーワード直後のコマンドで処理します。

do キーワードの直後に指定するコマンドは、セットで指定したファイルや文字列の数だけ実行されます。コマンド内では for コマンドに設定した変数を用いることができます。変数には、セットに指定された文字列のうち、現在の処理対象が格納されています。

サンプル 01

@echo off

for %%i in (1 2 3 4 5 6 7 8 9) do echo i=%%i

pause

実行結果

サンプル01の実行結果

サンプル01は、単純な値の列をセットに与え、指定した値を先頭から順に echo コマンドで出力するだけの簡単なforコマンドの例です。実行結果を見れば、セットに指定した値が順に処理されechoコマンドが実行されていることが確認できます。

echoコマンドが実行されるたびに、現在の処理対象である値が %%i 変数に格納されています。forコマンドで用いる変数はforコマンドの処理対象であるコマンドの中でしか使えません。よって、forコマンドの外で %%i 変数を利用することはできません。

forコマンドで処理するdoキーワードの直後に指定できるコマンドは 1つだけですが、ifコマンドの場合と同じように複数のコマンドを括弧 ( ) で括ることで複数のコマンドをforコマンドの実行対象にできます。この場合、forコマンドの実行対象であれば複数のコマンドにわたって変数を利用できます。

サンプル 02

@echo off

for %%i in (F0 E0 90 C0 A0) do (
    color %%i
    echo 現在の色は %%i です
    pause
)

echo 処理を終了しました
pause

実行結果

サンプル02の実行結果

サンプル02は、forコマンドのセットに指定した値をcolorコマンドのパラメータに指定する色として利用した反復処理です。forコマンドで繰り返し処理が実行されると colorコマンドでコマンドプロンプトの色を変更し、加えて echo コマンドでメッセージを表示したあとpause コマンドで一時停止しています。これら 3つのコマンドをforコマンドの実行対象とするために ( ) で括っています。