バッチファイルのFORループで、カレントディレクトリと配下のサブディレクトリすべてをチェックすることができます。本記事では、ディレクトリ内を再帰実行するFORループの書き方を紹介します。
再帰的な処理を行うFORループの書き方
FORコマンドに/R スイッチを使用することで、指定したディレクトリとそのサブディレクトリ内のすべてのファイルに対して操作を行うことができます。
FOR /R %%A IN (set) DO command [command-parameters]
上記のようにすると、ループ用の変数%%Aに、ファイルのフルパスが格納されます。この%%Aに格納されるフルパスには空白文字が含まれることがあるので注意してください。
見つけたファイルに1つのコマンドを実行する場合
見つかったファイルに対して実行するコマンドがひとつの場合は、DOの後に続けてコマンドを記述します。以下は、カレントディレクトリ内のテキストファイル(拡張子 .txt)のフルパスをechoコマンドで表示する例です。
@echo off
FOR /R %%A IN (*.txt) DO echo "%%A"
pause
ループ用変数%%Aには空白文字が含まれる場合があるのでダブルクォートで囲んで使う癖をつけると良いです。
実行結果
"R:\work\aaa bbb\file.txt"
"R:\work\aaa bbb\aaa.txt"
"R:\work\aaa bbb\bbb.txt"
"R:\work\aaa bbb\ccc.txt"
"R:\work\aaa bbb\log.txt"
"R:\work\aaa bbb\ccc\file.txt"
"R:\work\aaa bbb\ccc\aaa.txt"
続行するには何かキーを押してください . . .
見つけたファイルに複数のコマンドを実行する場合
見つかったファイルに対して実行するコマンドが複数の場合は、DOの後に丸括弧で囲んで複数のコマンドを記述します。以下は、カレントディレクトリ内のテキストファイル(拡張子 .txt)のファイル名をechoコマンドで表示し、typeコマンドでファイルの内容も表示する例です。
@echo off
FOR /R %%A IN (*.txt) DO (
echo ---- "%%A" ----
dir "%%A"
)
pause
ループ用変数%%Aには空白文字が含まれる場合があるのでダブルクォートで囲んで使う癖をつけると良いです。
実行結果
(省略)
---- "R:\work\aaa bbb\ccc\aaa.txt" ----
ドライブ R のボリューム ラベルがありません。
ボリューム シリアル番号は xxxx-xxxx です
R:\work\aaa bbb\ccc のディレクトリ
2024/03/15 23:22 0 aaa.txt
1 個のファイル 0 バイト
0 個のディレクトリ 3,814,780,928 バイトの空き領域
続行するには何かキーを押してください . . .
まとめ
FORコマンドに/R スイッチは覚えておくと便利です。大量のファイルを処理する必要があるときに、ぜひご活用ください。