「写真をフォルダ名で整理してエクスポートしたい」「プロジェクト名をファイル名の先頭に付けて一括管理したい」——フォルダ名をプレフィックスとしてファイル名に追加するのは整理・管理の定番作業です。本記事では for ループと ren コマンドを組み合わせた基本パターン から、任意フォルダ指定・サブフォルダ再帰・重複プレフィックス防止・ドライランモードまで体系的に解説します。
この記事で解決できること
- フォルダ直下の全ファイル名の先頭にフォルダ名を付ける方法
- 任意フォルダを指定してプレフィックスを付ける方法
- サブフォルダも再帰的に処理する方法(各フォルダ名を使用)
- セパレーター(
_や-など)をカスタマイズする方法 - 既にプレフィックスが付いているファイルをスキップする重複防止パターン
- 変換前にドライランで対象ファイルを確認する方法
- 特定の拡張子のみを対象にする方法
基本の仕組み
ファイル名にフォルダ名を付ける処理は以下の3ステップで構成されます。
| ステップ | 処理 | 使用する仕組み |
|---|---|---|
| ① | フォルダ名を取得する | %%~nF(for 変数修飾子) |
| ② | 対象ファイルを1件ずつループ | for %%f in (*.*) |
| ③ | 新ファイル名でリネーム | ren "旧名" "フォルダ名_旧名" |
方法1: スクリプト自身があるフォルダのファイルを処理
基本パターン(最もシンプル)
@echo off
setlocal enabledelayedexpansion
rem %~dp0 = このスクリプトのあるフォルダのパス(末尾に あり)
rem %~dp0.. で親フォルダを参照し、%%~nF でフォルダ名を取得
for %%F in ("%~dp0.") do set "FOLDER_NAME=%%~nF"
echo 対象フォルダ: %~dp0
echo フォルダ名: %FOLDER_NAME%
echo.
set COUNT=0
for %%f in ("%~dp0*.*") do (
rem バッチファイル自身はスキップ
if /i not "%%~xf"==".bat" (
ren "%%~ff" "%FOLDER_NAME%_%%~nxf"
if not errorlevel 1 (
echo リネーム: %%~nxf → %FOLDER_NAME%_%%~nxf
set /a COUNT+=1
)
)
)
echo.
echo 完了: !COUNT! ファイルをリネームしました
endlocal
フォルダ名の取得方法
for %%F in ("%~dp0.") do set "FOLDER_NAME=%%~nF"%~dp0 は末尾に が付くため、%~dp0.(ドットを付けてカレントを参照)を for に渡すことでフォルダ名だけを取り出せます。
方法2: 任意のフォルダを指定して処理
フォルダパスを変数で指定
@echo off
setlocal enabledelayedexpansion
rem 処理対象フォルダを指定
set "TARGET=C:workphotos"
rem フォルダ名を取得
for %%F in ("%TARGET%") do set "FOLDER_NAME=%%~nF"
if not exist "%TARGET%" (
echo [ERROR] フォルダが見つかりません: %TARGET%
exit /b 1
)
echo 対象フォルダ: %TARGET%
echo フォルダ名: %FOLDER_NAME%
echo.
set COUNT=0
set FAIL=0
for %%f in ("%TARGET%*.*") do (
ren "%%~ff" "%FOLDER_NAME%_%%~nxf"
if not errorlevel 1 (
echo [OK] %%~nxf → %FOLDER_NAME%_%%~nxf
set /a COUNT+=1
) else (
echo [FAIL] %%~nxf
set /a FAIL+=1
)
)
echo.
echo 完了: 成功 !COUNT! 件 / 失敗 !FAIL! 件
endlocal
コマンドライン引数でフォルダを指定(汎用版)
@echo off
setlocal enabledelayedexpansion
rem 使い方: prefix_folder.bat [対象フォルダパス]
rem 例: prefix_folder.bat "C:workphotos"
if "%~1"=="" (
echo 使い方: %~nx0 [対象フォルダ]
echo 例: %~nx0 "C:workphotos"
exit /b 1
)
set "TARGET=%~1"
if not exist "%TARGET%" (
echo [ERROR] フォルダが見つかりません: %TARGET%
exit /b 1
)
for %%F in ("%TARGET%") do set "FOLDER_NAME=%%~nF"
set COUNT=0
for %%f in ("%TARGET%*.*") do (
ren "%%~ff" "%FOLDER_NAME%_%%~nxf"
if not errorlevel 1 (
echo [OK] %%~nxf → %FOLDER_NAME%_%%~nxf
set /a COUNT+=1
)
)
echo.
echo 完了: !COUNT! ファイルをリネームしました
endlocal
方法3: セパレーターをカスタマイズする
デフォルトは _(アンダースコア)ですが、-(ハイフン)・スペース・その他の文字に変更できます。
@echo off
setlocal enabledelayedexpansion
set "TARGET=C:workphotos"
rem セパレーターを変更(例: _ → - )
set "SEP=-"
for %%F in ("%TARGET%") do set "FOLDER_NAME=%%~nF"
set COUNT=0
for %%f in ("%TARGET%*.*") do (
ren "%%~ff" "%FOLDER_NAME%%SEP%%%~nxf"
if not errorlevel 1 (
echo [OK] %%~nxf → %FOLDER_NAME%%SEP%%%~nxf
set /a COUNT+=1
)
)
echo 完了: !COUNT! ファイルをリネームしました
endlocal
方法4: 特定の拡張子のみを対象にする
1種類の拡張子を対象
@echo off
setlocal enabledelayedexpansion
set "TARGET=C:workphotos"
set "EXT=jpg"
for %%F in ("%TARGET%") do set "FOLDER_NAME=%%~nF"
set COUNT=0
rem *.jpg のみを対象にリネーム
for %%f in ("%TARGET%*.%EXT%") do (
ren "%%~ff" "%FOLDER_NAME%_%%~nxf"
if not errorlevel 1 (
echo [OK] %%~nxf → %FOLDER_NAME%_%%~nxf
set /a COUNT+=1
)
)
echo 完了: !COUNT! ファイルをリネームしました
endlocal
複数の拡張子を対象
@echo off
setlocal enabledelayedexpansion
set "TARGET=C:workphotos"
rem 対象拡張子をスペース区切りで列挙
set "EXT_LIST=jpg jpeg png gif"
for %%F in ("%TARGET%") do set "FOLDER_NAME=%%~nF"
set TOTAL=0
for %%E in (%EXT_LIST%) do (
echo --- 拡張子 .%%E を処理中 ---
for %%f in ("%TARGET%*.%%E") do (
ren "%%~ff" "%FOLDER_NAME%_%%~nxf"
if not errorlevel 1 (
echo [OK] %%~nxf → %FOLDER_NAME%_%%~nxf
set /a TOTAL+=1
)
)
)
echo 完了: !TOTAL! ファイルをリネームしました
endlocal
方法5: 重複プレフィックスを防ぐ(既存チェック)
スクリプトを2回実行してしまった場合に フォルダ名_フォルダ名_ファイル名 と二重になるのを防ぎます。
@echo off
setlocal enabledelayedexpansion
set "TARGET=C:workphotos"
for %%F in ("%TARGET%") do set "FOLDER_NAME=%%~nF"
set COUNT=0
set SKIP=0
for %%f in ("%TARGET%*.*") do (
set "FNAME=%%~nxf"
rem ファイル名がすでにフォルダ名で始まっているかチェック
echo !FNAME! | findstr /b /i /c:"%FOLDER_NAME%_" >nul
if not errorlevel 1 (
echo [SKIP] 既にプレフィックス済み: %%~nxf
set /a SKIP+=1
) else (
ren "%%~ff" "%FOLDER_NAME%_%%~nxf"
if not errorlevel 1 (
echo [OK] %%~nxf → %FOLDER_NAME%_%%~nxf
set /a COUNT+=1
)
)
)
echo.
echo 完了: リネーム !COUNT! 件 / スキップ !SKIP! 件
endlocal
方法6: ドライラン(実際にはリネームせず確認のみ)
@echo off
setlocal enabledelayedexpansion
set "TARGET=C:workphotos"
rem DRYRUN=1 にすると確認のみ(実際にはリネームしない)
set DRYRUN=1
for %%F in ("%TARGET%") do set "FOLDER_NAME=%%~nF"
echo === ドライラン モード ===
echo 対象フォルダ: %TARGET%
echo フォルダ名: %FOLDER_NAME%
echo.
set COUNT=0
for %%f in ("%TARGET%*.*") do (
if "%DRYRUN%"=="1" (
echo [DRYRUN] %%~nxf → %FOLDER_NAME%_%%~nxf
) else (
ren "%%~ff" "%FOLDER_NAME%_%%~nxf"
echo [OK] %%~nxf → %FOLDER_NAME%_%%~nxf
)
set /a COUNT+=1
)
echo.
if "%DRYRUN%"=="1" (
echo [DRYRUN] !COUNT! ファイルが対象です(実際にはリネームしていません)
echo 実行するには DRYRUN=0 に変更してください
) else (
echo 完了: !COUNT! ファイルをリネームしました
)
endlocal
方法7: サブフォルダも再帰的に処理(各フォルダ名をプレフィックスに)
for /r を使って全サブフォルダを対象にし、各ファイルが属するフォルダの名前をプレフィックスとして付けるパターンです。
@echo off
setlocal enabledelayedexpansion
set "ROOT=C:workphotos"
set TOTAL=0
echo ルートフォルダ: %ROOT%
echo.
rem /r でサブフォルダを再帰的に処理
for /r "%ROOT%" %%f in (*.*) do (
rem %%~dpf = そのファイルのフォルダパス(末尾 あり)
for %%D in ("%%~dpf.") do set "DIR_NAME=%%~nD"
rem 既にプレフィックスが付いていなければリネーム
echo !DIR_NAME! | findstr /b /i /c:"!DIR_NAME!_" >nul
set "NEW_NAME=!DIR_NAME!_%%~nxf"
ren "%%~ff" "!NEW_NAME!"
if not errorlevel 1 (
echo [OK] %%~ff → !NEW_NAME!
set /a TOTAL+=1
)
)
echo.
echo 完了: !TOTAL! ファイルをリネームしました
endlocal
実践例A: 写真整理(日付フォルダ名をファイル名に付加)
日付別フォルダ(例: 20250101)に保存した写真ファイルに、フォルダ名(日付)を先頭に付けて一元管理するパターンです。
@echo off
setlocal enabledelayedexpansion
rem 対象フォルダ(例: 20250101 という名前の写真フォルダ)
set "PHOTO_DIR=C:workphotos20250101"
for %%F in ("%PHOTO_DIR%") do set "DATE_PREFIX=%%~nF"
if not exist "%PHOTO_DIR%" (
echo [ERROR] フォルダが存在しません: %PHOTO_DIR%
exit /b 1
)
echo === 写真リネーム: %PHOTO_DIR% ===
echo プレフィックス: %DATE_PREFIX%
echo.
set COUNT=0
rem 画像ファイルのみを対象
for %%E in (jpg jpeg png) do (
for %%f in ("%PHOTO_DIR%*.%%E") do (
rem 既に日付プレフィックスが付いていたらスキップ
echo %%~nxf | findstr /b /c:"%DATE_PREFIX%" >nul
if not errorlevel 1 (
echo [SKIP] %%~nxf
) else (
ren "%%~ff" "%DATE_PREFIX%_%%~nxf"
if not errorlevel 1 (
echo [OK] %%~nxf → %DATE_PREFIX%_%%~nxf
set /a COUNT+=1
)
)
)
)
echo.
echo 完了: !COUNT! ファイルをリネームしました
endlocal
実践例B: 複数フォルダを一括処理(フォルダリストから順に実行)
@echo off
setlocal enabledelayedexpansion
rem 処理対象フォルダをスペース区切りで列挙(スペースがある場合は引用符付きリストを使う)
set "DIR_LIST=C:workA C:workB C:workC"
set GRAND_TOTAL=0
for %%D in (%DIR_LIST%) do (
if exist "%%D" (
for %%F in ("%%D") do set "FOLDER_NAME=%%~nF"
echo === フォルダ: %%D ===
set COUNT=0
for %%f in ("%%D*.*") do (
ren "%%~ff" "!FOLDER_NAME!_%%~nxf"
if not errorlevel 1 (
echo [OK] %%~nxf → !FOLDER_NAME!_%%~nxf
set /a COUNT+=1
)
)
echo 完了: !COUNT! 件
set /a GRAND_TOTAL+=COUNT
) else (
echo [SKIP] フォルダなし: %%D
)
)
echo.
echo 全フォルダ合計: !GRAND_TOTAL! ファイルをリネームしました
endlocal
実践例C: 変換ログを CSV に記録する完全版
@echo off
setlocal enabledelayedexpansion
set "TARGET=C:workphotos"
set "LOGFILE=%~dp0rename_log.csv"
for %%F in ("%TARGET%") do set "FOLDER_NAME=%%~nF"
rem CSV ヘッダー(初回のみ)
if not exist "%LOGFILE%" (
echo 日時,フォルダ,変換前,変換後,結果 > "%LOGFILE%"
)
set COUNT=0
set SKIP=0
set FAIL=0
for %%f in ("%TARGET%*.*") do (
set "OLD=%%~nxf"
set "NEW=%FOLDER_NAME%_%%~nxf"
rem 重複チェック
echo !OLD! | findstr /b /i /c:"%FOLDER_NAME%_" >nul
if not errorlevel 1 (
echo [SKIP] !OLD!
set /a SKIP+=1
echo %DATE% %TIME%,%TARGET%,!OLD!,!NEW!,SKIP >> "%LOGFILE%"
) else (
ren "%%~ff" "!NEW!"
if not errorlevel 1 (
echo [OK] !OLD! → !NEW!
set /a COUNT+=1
echo %DATE% %TIME%,%TARGET%,!OLD!,!NEW!,OK >> "%LOGFILE%"
) else (
echo [FAIL] !OLD!
set /a FAIL+=1
echo %DATE% %TIME%,%TARGET%,!OLD!,!NEW!,FAIL >> "%LOGFILE%"
)
)
)
echo.
echo 完了: リネーム !COUNT! 件 / スキップ !SKIP! 件 / 失敗 !FAIL! 件
echo ログ: %LOGFILE%
endlocal
よくある落とし穴
落とし穴1: ren は別フォルダへの移動ができない(ファイル名のみ変更)
rem NG: ren でパスを含む新ファイル名を指定するとエラー ren "C:srcfile.txt" "C:dstprefix_file.txt" ← エラー rem OK: ren はファイル名のみ。同フォルダ内でリネームする ren "C:srcfile.txt" "prefix_file.txt" rem 別フォルダへ移動しつつリネームしたい場合は move を使う move "C:srcfile.txt" "C:dstprefix_file.txt"
落とし穴2: 同名のリネーム先ファイルが既に存在するとエラー
rem 「photos_photo.jpg」が既にある状態で再実行するとエラー
rem 事前に存在チェックを行うか、重複プレフィックスチェックを入れる
rem 対策: if not exist でリネーム先の存在を確認
for %%f in ("%TARGET%*.*") do (
if not exist "%TARGET%\%FOLDER_NAME%_%%~nxf" (
ren "%%~ff" "%FOLDER_NAME%_%%~nxf"
) else (
echo [SKIP] リネーム先が既に存在: %FOLDER_NAME%_%%~nxf
)
)
落とし穴3: %~dp0. でフォルダ名を取得できない場合
rem %~dp0 の末尾の のせいで直接 %%~nF が空になる場合がある
rem NG: %~dp0 をそのまま for に渡すと末尾の が問題になる
for %%F in ("%~dp0") do set "FOLDER_NAME=%%~nF" ← 空になることがある
rem OK: %~dp0. (末尾にドット)を付けて for に渡す
for %%F in ("%~dp0.") do set "FOLDER_NAME=%%~nF"
落とし穴4: スペースを含むフォルダ名のクォート忘れ
rem NG: スペースを含むパスをクォートなしで指定するとエラー
for %%f in (%TARGET%*.*) do ...
rem OK: パスをダブルクォートで囲む
for %%f in ("%TARGET%*.*") do ...
落とし穴5: バッチファイル自身がリネーム対象になる
rem スクリプト自身が同フォルダにある場合、.bat もリネーム対象になる
rem 対策: .bat をスキップする
for %%f in ("%~dp0*.*") do (
if /i not "%%~xf"==".bat" (
ren "%%~ff" "%FOLDER_NAME%_%%~nxf"
)
)
よくある質問(FAQ)
Q フォルダ名ではなく任意のプレフィックスを付けたい
A
フォルダ名の取得部分を省略して、固定文字列を変数に設定するだけです。
@echo off
setlocal enabledelayedexpansion
set "TARGET=C:workfiles"
rem フォルダ名の代わりに任意のプレフィックスを指定
set "PREFIX=ProjectAlpha"
set COUNT=0
for %%f in ("%TARGET%*.*") do (
ren "%%~ff" "%PREFIX%_%%~nxf"
if not errorlevel 1 (
echo [OK] %%~nxf → %PREFIX%_%%~nxf
set /a COUNT+=1
)
)
echo 完了: !COUNT! ファイル
endlocal
Q リネーム前にバックアップしたい
A
リネーム前にファイルをコピーしてバックアップを取ってから処理します。
@echo off
setlocal enabledelayedexpansion
set "TARGET=C:workphotos"
set "BACKUP=%TARGET%_backup_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%"
if not exist "%BACKUP%" mkdir "%BACKUP%"
for %%F in ("%TARGET%") do set "FOLDER_NAME=%%~nF"
for %%f in ("%TARGET%*.*") do (
rem バックアップ先にコピー
copy "%%~ff" "%BACKUP%\%%~nxf" >nul
if not errorlevel 1 (
rem バックアップ成功後にリネーム
ren "%%~ff" "%FOLDER_NAME%_%%~nxf"
echo [OK] %%~nxf → %FOLDER_NAME%_%%~nxf
) else (
echo [FAIL] バックアップ失敗(スキップ): %%~nxf
)
)
echo バックアップ: %BACKUP%
endlocal
Q ファイル名の先頭ではなく末尾にフォルダ名を付けたい
A
ファイル名(拡張子なし)の後に付けて、拡張子を元に戻します。
@echo off
setlocal enabledelayedexpansion
set "TARGET=C:workphotos"
for %%F in ("%TARGET%") do set "FOLDER_NAME=%%~nF"
for %%f in ("%TARGET%*.*") do (
rem %%~nf = ファイル名のみ(拡張子なし) %%~xf = 拡張子(ドット含む)
set "NEW_NAME=%%~nf_%FOLDER_NAME%%%~xf"
ren "%%~ff" "!NEW_NAME!"
echo [OK] %%~nxf → !NEW_NAME!
)
endlocal
Q リネームを元に戻したい(プレフィックスを除去したい)
A
文字列置換を使ってプレフィックスを除去します。
@echo off
setlocal enabledelayedexpansion
set "TARGET=C:workphotos"
for %%F in ("%TARGET%") do set "FOLDER_NAME=%%~nF"
for %%f in ("%TARGET%*.*") do (
set "FNAME=%%~nxf"
rem プレフィックス(フォルダ名_)を除去
set "NEW_NAME=!FNAME:%FOLDER_NAME%_=!"
rem 変化があった場合のみリネーム
if not "!FNAME!"=="!NEW_NAME!" (
ren "%%~ff" "!NEW_NAME!"
echo [OK] %%~nxf → !NEW_NAME!
)
)
endlocal
Q フォルダ名に使えない文字が含まれているとどうなるか
A
Windows のファイル名に使えない文字( / : * ? " < > |)がフォルダ名に含まれる場合、そのままではリネームに失敗します。
使えない文字を事前に置換してから利用してください。
rem フォルダ名から使用不可文字をアンダースコアに置換
for %%F in ("%TARGET%") do set "FOLDER_NAME=%%~nF"
rem コロンを置換(例)
set "FOLDER_NAME=%FOLDER_NAME::=_%"
rem スペースを置換(例)
set "FOLDER_NAME=%FOLDER_NAME: =_%"
まとめ
| 目的 | 推奨パターン |
|---|---|
| スクリプトと同じフォルダを処理 | for %%F in ("%~dp0.") do set FOLDER_NAME=%%~nF |
| 任意フォルダを指定して処理 | 変数 TARGET にパスを設定 |
| セパレーターをカスタマイズ | set SEP=- で変更 |
| 特定拡張子のみ対象 | for %%f in ("*.jpg") で絞り込み |
| 重複プレフィックス防止 | findstr /b で先頭一致チェック |
| ドライランで事前確認 | DRYRUN=1 で echo のみ実行 |
| サブフォルダも再帰処理 | for /r + 各フォルダ名を取得 |
| 元に戻す(プレフィックス除去) | 文字列置換 !FNAME:PREFIX_=! |
ファイルのリネームに関する詳細は ファイルの拡張子を一括変換する方法 を、特定のファイルをコピーする方法は 特定の文字列を含むファイルをコピーする方法 も合わせて参照してください。

