バッチファイルを使用してファイルを自動で処理する場合、複数のフォルダに対して同じ操作を一括で行いたいことがあります。
例えば、「全フォルダ内のファイルをスキャンする」「各フォルダにログファイルを作成する」などがその典型です。
この記事では、forループ構文を使って複数フォルダを順番に処理する方法を解説します。
基本構文 サブフォルダをループ処理する
以下は、カレントディレクトリ内の全てのフォルダを対象にループ処理を行う基本構文です。
@echo off
rem カレントディレクトリのすべてのフォルダをループ
for /d %%F in (*) do (
echo フォルダ名: %%F
rem フォルダ内の処理をここに記述
)
- for /d %%F in (*) は、カレントディレクトリ内のすべてのフォルダに対してループします。
- %%F はループ中の各フォルダ名を表します。
- 実行時に何か操作(コピー、ログ出力など)を行いたい場合は、echo の代わりに任意のコマンドを記述します。
サブフォルダ配下のファイルを対象にする
各フォルダの中にあるファイルも含めて処理したい場合は、次のようにネスト(入れ子)ループにします。
@echo off
for /d %%F in (*) do (
echo --- フォルダ: %%F ---
for %%G in ("%%F\*.*") do (
echo ファイル: %%G
)
)
例:各フォルダ内の.txtファイルを別フォルダに移動する
@echo off
set DEST=collected_txt
if not exist %DEST% (
mkdir %DEST%
)
for /d %%F in (*) do (
for %%G in ("%%F\*.txt") do (
move "%%G" %DEST%
)
)
特定フォルダだけを対象にしたい場合
フォルダ名にパターンがある場合、if 文で条件を追加できます。
@echo off
for /d %%F in (*) do (
echo %%F | find "backup_" >nul
if not errorlevel 1 (
echo %%F はバックアップ対象フォルダです
)
)
@echo off
for /d %%F in (*) do (
echo %%F | find "backup_" >nul
if not errorlevel 1 (
echo %%F はバックアップ対象フォルダです
)
)
この例では、フォルダ名に「backup_」が含まれているものだけを対象にしています。
サブフォルダを再帰的に探索したい場合
すべての階層にあるフォルダを対象に処理したい場合は、for /rを使います。
@echo off
for /r %%F in (.) do (
if exist "%%F\" (
echo サブフォルダ: %%F
rem 処理をここに記述
)
)
まとめ
バッチファイルのfor構文を活用すれば、複数のフォルダをループ処理して一括で操作することが可能です。
定期的なメンテナンス作業や大量データの管理を自動化したい場面で、大いに役立ちます。
フォルダの構造や処理内容に合わせて柔軟にカスタマイズし、効率的なバッチ処理を実現しましょう。