【bat】ファイル名の先頭にフォルダ名を一括で付ける方法完全ガイド|for・ren・サブフォルダ再帰・重複防止・ドライラン・実践パターンまで

【bat】ファイル名の先頭にフォルダ名を一括で付ける方法完全ガイド|for・ren・サブフォルダ再帰・重複防止・ドライラン・実践パターンまで bat

「写真をフォルダ名で整理してエクスポートしたい」「プロジェクト名をファイル名の先頭に付けて一括管理したい」——フォルダ名をプレフィックスとしてファイル名に追加するのは整理・管理の定番作業です。本記事では 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=1echo のみ実行
サブフォルダも再帰処理 for /r + 各フォルダ名を取得
元に戻す(プレフィックス除去) 文字列置換 !FNAME:PREFIX_=!

ファイルのリネームに関する詳細は ファイルの拡張子を一括変換する方法 を、特定のファイルをコピーする方法は 特定の文字列を含むファイルをコピーする方法 も合わせて参照してください。