For でファイルをループ処理 → 拡張子別に分類・処理 - Windowsコマンド実用例
Windowsバッチでは For コマンドを使って、フォルダー内のファイルを1つずつ処理することができます。拡張子ごとに分類して処理したい場合や、ファイル名に応じて動作を分岐させるときに便利です。
使用コマンド
基本構文
@echo off
for %%F in (*.*) do (
echo 処理対象: %%F
)
カレントディレクトリのすべてのファイルに対して、1つずつ処理を行います。
拡張子ごとの分類と処理
@echo off
for %%F in (*.*) do (
call :process_file "%%F"
)
exit /b
:process_file
setlocal
set "ext=%~x1"
if /I "%ext%"==".txt" (
echo テキストファイル: %~1 を backup\text にコピー
copy "%~1" backup\text\
) else if /I "%ext%"==".jpg" (
echo 画像ファイル: %~1 を backup\images にコピー
copy "%~1" backup\images\
) else (
echo その他のファイル: %~1 を backup\others にコピー
copy "%~1" backup\others\
)
exit /b
ファイルの拡張子を判定し、それぞれ対応するフォルダーにコピーします。実行前に backup\text
などのディレクトリを mkdir
で作成しておく必要があります。
補足事項
応用例: ファイルサイズで処理を分ける
@echo off
for %%F in (*.*) do (
call :check_size "%%F"
)
exit /b
:check_size
setlocal
set "file=%~1"
set "size=%~z1"
echo ファイル %file% のサイズは %size% バイト
if %size% GEQ 100000 (
echo → 大きなファイル: %file% を large フォルダーへ
copy "%file%" backup\large\
) else (
echo → 小さなファイル: %file% を small フォルダーへ
copy "%file%" backup\small\
)
exit /b
%~z1
でサブルーチン内からファイルサイズを取得し、容量によってコピー先を振り分けます。
応用例: 更新日時でフィルタして処理
@echo off
for %%F in (*.*) do (
call :check_date "%%F"
)
exit /b
:check_date
setlocal
for /f "tokens=1-3 delims=/ " %%a in ("%~t1") do (
set "yy=%%c"
set "mm=%%a"
set "dd=%%b"
)
if %yy% GEQ 2023 (
echo → 新しいファイル: %~1 を recent フォルダーへ
copy "%~1" backup\recent\
)
exit /b
ファイルの更新日時(%~t1
)を分解して条件分岐します。この例では for /f
を使って日時文字列をトークン分割し、年・月・日を取得しています。日付形式は環境によって異なるため、必要に応じてトークンの調整が必要です。