Programming Field

For でファイルをループ処理 → 拡張子別に分類・処理 - Windowsコマンド実用例

Windowsバッチでは For コマンドを使って、フォルダー内のファイルを1つずつ処理することができます。拡張子ごとに分類して処理したい場合や、ファイル名に応じて動作を分岐させるときに便利です。

使用コマンド

  • For - ファイルや文字列をループ(列挙)処理
  • If - 条件による分岐処理
  • Copy - ファイルコピー

基本構文

@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 で作成しておく必要があります。

補足事項

  • 環境変数の展開を正しく行うために、callsetlocal を併用しています。
  • 変数の比較では if /I を使うことで大文字・小文字を無視しています。
  • 分類対象が増える場合は else if を追加してください。

応用例: ファイルサイズで処理を分ける

@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 を使って日時文字列をトークン分割し、年・月・日を取得しています。日付形式は環境によって異なるため、必要に応じてトークンの調整が必要です。

関連項目