【bat】バッチファイルでフォルダ名を変更する完全ガイド|ren・一括リネーム・日付付き・連番・プレフィックス追加・ドライラン・実践パターンまで徹底解説

【bat】バッチファイルでフォルダ名を変更する完全ガイド|ren・一括リネーム・日付付き・連番・プレフィックス追加・ドライラン・実践パターンまで徹底解説 bat

バッチファイルでフォルダ名を変更したい場面は意外と多くあります。「プロジェクトフォルダに日付を付ける」「連番を振り直す」「一定パターンのフォルダを一括でリネームする」など、手作業では面倒な命名規則の変更を自動化できます。Windowsバッチでは ren(または rename)コマンドがフォルダ名変更の基本ですが、新しい名前にパスを含められない・移動を同時にできないなど独自の制限があります。本記事では ren の基本から、for /d を使った複数フォルダの一括リネーム・日付付きリネーム・連番付加・プレフィックス/サフィックス追加・文字列置換・ドライランまで完全解説します。

この記事でわかること

  • ren コマンドでフォルダ名を変更する基本構文
  • ren の制限(同一ディレクトリ内・パスを含められない)
  • スペースを含むフォルダ名を正しく扱う方法
  • for /d ループで複数フォルダを一括リネームする方法
  • フォルダ名に日付(YYYYMMDD)を付加する方法
  • 連番(001_, 002_…)を付加する方法
  • プレフィックス・サフィックスを追加・削除する方法
  • PowerShell を使って文字列の一部を置換する方法
  • ドライラン(実際には変更せず確認だけする)の実装方法
  • 実践例3本(月別フォルダ整理・プロジェクト連番振り直し・一括プレフィックス付加)
スポンサーリンク

1. 基本:ren コマンドでフォルダ名を変更する

Windowsバッチでフォルダ名を変更するコマンドは renrename と同義)です。ファイルのリネームにも使えますが、フォルダ名の変更も同じコマンドで対応できます。

:: 基本構文
:: ren 変更前のパス\フォルダ名 新しいフォルダ名

:: 例1: 同じ場所で名前だけ変える(カレントディレクトリにある場合)
ren "OldFolder" "NewFolder"

:: 例2: フルパスで指定(移動元にパスを含められる)
ren "C:\work\OldFolder" "NewFolder"

:: 注意: 新しい名前にはパスを含められない(エラーになる)
:: ren "C:\work\OldFolder" "C:\archive\NewFolder"   ← NG!
ren は「同一ディレクトリ内でのリネーム」のみ
ren コマンドは新しい名前にパス(\を含む文字列)を指定できません。「名前を変えながら別の場所に移動する」場合は ren ではなく move "元パス" "新パス\新名前" を使ってください。詳しくは バッチファイルでフォルダを移動する完全ガイド を参照してください。

1-1. ren コマンドの動作確認とエラーレベルのチェック

@echo off
setlocal

set TARGET_DIR=C:\work
set OLD_NAME=OldFolder
set NEW_NAME=NewFolder

:: 変更前フォルダの存在確認
if not exist "%TARGET_DIR%\%OLD_NAME%\" (
    echo [ERROR] 変更対象フォルダが見つかりません: %TARGET_DIR%\%OLD_NAME%
    exit /b 1
)

:: 新しい名前が既に存在する場合はスキップ
if exist "%TARGET_DIR%\%NEW_NAME%\" (
    echo [ERROR] 新しい名前のフォルダが既に存在します: %TARGET_DIR%\%NEW_NAME%
    exit /b 1
)

ren "%TARGET_DIR%\%OLD_NAME%" "%NEW_NAME%"
if %ERRORLEVEL% equ 0 (
    echo [OK] リネーム完了: %OLD_NAME% → %NEW_NAME%
) else (
    echo [ERROR] リネーム失敗
    exit /b 1
)
フォルダ存在確認は末尾に \ を付ける
if exist "C:\work\folder" はファイル・フォルダ両方にマッチします。フォルダのみを確認するには末尾に \ を付けて if exist "C:\work\folder\" と書きます。これにより同名ファイルが存在してもフォルダの存在確認に限定できます。

2. スペースを含むフォルダ名を正しく扱う

フォルダ名にスペースが含まれる場合(例: My Projectold data)、ダブルクォートで囲まないとエラーになります。変更前・変更後の名前の両方にダブルクォートが必要です。

:: NG: スペースのある名前をクォートなしで指定 → エラー
ren C:\work\My Project New Project
:: → "C:\work\My" と "Project" を別引数として解釈するためエラー

:: OK: 変更前はパス+名前をまとめてクォート、変更後の名前もクォート
ren "C:\work\My Project" "New Project"

:: 変数を使う場合
set OLD=My Project
set NEW=New Project
ren "C:\work\%OLD%" "%NEW%"
ren の第2引数(新しい名前)はパスではなく「名前だけ」
ren "C:\work\My Project" "C:\archive\New Project" のように第2引数にパスを含めるとエラーになります。第2引数にはフォルダ名のみ(パス区切り \ なし)を指定してください。例: ren "C:\work\My Project" "New Project"

3. for /d で複数フォルダを一括リネームする

ren コマンド単体でのワイルドカードはファイル名のパターン変換(例: *.txt → *.bak)には使えますが、フォルダ名の自由な一括変換には向きません。for /d ループでフォルダを1つずつ処理する方法が汎用的です。

3-1. 特定パターンに一致するフォルダをすべてリネームする

@echo off
setlocal enabledelayedexpansion

set TARGET_DIR=C:\work

:: "project_" で始まるフォルダをすべて "proj_" に変更
set COUNT=0
for /d %%F in ("%TARGET_DIR%\project_*") do (
    set OLD_NAME=%%~nxF
    :: 古いプレフィックスを除いた部分(project_ の後)を取得
    set SUFFIX=!OLD_NAME:project_=!
    set NEW_NAME=proj_!SUFFIX!

    :: 新名が既に存在する場合はスキップ
    if exist "%TARGET_DIR%\!NEW_NAME!\" (
        echo [SKIP] 既に存在: !NEW_NAME!
    ) else (
        ren "%%~fF" "!NEW_NAME!"
        if !ERRORLEVEL! equ 0 (
            echo [OK] !OLD_NAME! → !NEW_NAME!
            set /a COUNT+=1
        ) else (
            echo [FAIL] !OLD_NAME!
        )
    )
)

echo.
echo !COUNT! 件リネームしました

3-2. リストファイルで「旧名→新名」のマッピングを管理する

変更内容をバッチファイルに直書きせず、「旧名,新名」の CSV 形式のリストファイルで管理するパターンです。変更セットが多いときや、レビュー後に実行したいときに便利です。

@echo off
setlocal enabledelayedexpansion

:: rename_list.txt の書式: 旧フォルダ名,新フォルダ名(コメントは # で)
:: 例:
:: # プロジェクトリネームリスト
:: old_project_A,new_project_A
:: old_project_B,new_project_B

set TARGET_DIR=C:\work
set LIST=C:\work\rename_list.txt

if not exist "%LIST%" ( echo [ERROR] リストファイルが見つかりません & exit /b 1 )

set COUNT=0
for /f "usebackq eol=# tokens=1,2 delims=," %%A in ("%LIST%") do (
    set OLD=%%A
    set NEW=%%B

    if not exist "%TARGET_DIR%\!OLD!\" (
        echo [SKIP] 見つかりません: !OLD!
    ) else if exist "%TARGET_DIR%\!NEW!\" (
        echo [SKIP] 既に存在: !NEW!
    ) else (
        ren "%TARGET_DIR%\!OLD!" "!NEW!"
        if !ERRORLEVEL! equ 0 (
            echo [OK] !OLD! → !NEW!
            set /a COUNT+=1
        ) else (
            echo [FAIL] !OLD! → !NEW!
        )
    )
)

echo.
echo !COUNT! 件リネームしました

4. フォルダ名に日付を付加する(YYYYMMDD形式)

「フォルダを作成日や今日の日付でアーカイブ名に変更する」「定期処理で日付サフィックスを付ける」といったパターンは業務でよく使われます。wmic コマンドで正確な日付文字列を取得し、フォルダ名に組み込みます。

@echo off
setlocal

:: 今日の日付を YYYYMMDD 形式で取得
for /f "tokens=2 delims==." %%D in ('wmic os get LocalDateTime /value ^| findstr LocalDateTime') do set DT=%%D
set TODAY=%DT:~0,8%

set TARGET_DIR=C:\work
set OLD_NAME=temp
set NEW_NAME=temp_%TODAY%

if not exist "%TARGET_DIR%\%OLD_NAME%\" (
    echo [ERROR] 見つかりません: %OLD_NAME% & exit /b 1
)
if exist "%TARGET_DIR%\%NEW_NAME%\" (
    echo [ERROR] 既に存在: %NEW_NAME% & exit /b 1
)

ren "%TARGET_DIR%\%OLD_NAME%" "%NEW_NAME%"
if %ERRORLEVEL% equ 0 (
    echo [OK] リネーム完了: %OLD_NAME% → %NEW_NAME%
) else (
    echo [ERROR] リネーム失敗
    exit /b 1
)

4-1. 複数フォルダに一括で今日の日付サフィックスを付ける

@echo off
setlocal enabledelayedexpansion

:: 今日の日付を YYYYMMDD 形式で取得
for /f "tokens=2 delims==." %%D in ('wmic os get LocalDateTime /value ^| findstr LocalDateTime') do set DT=%%D
set TODAY=%DT:~0,8%

set TARGET_DIR=C:\work

:: "done_" で始まるフォルダに日付サフィックスを付ける
set COUNT=0
for /d %%F in ("%TARGET_DIR%\done_*") do (
    set FNAME=%%~nxF
    set NEW_NAME=!FNAME!_%TODAY%

    if exist "%TARGET_DIR%\!NEW_NAME!\" (
        echo [SKIP] 既に存在: !NEW_NAME!
    ) else (
        ren "%%~fF" "!NEW_NAME!"
        if !ERRORLEVEL! equ 0 (
            echo [OK] !FNAME! → !NEW_NAME!
            set /a COUNT+=1
        ) else (
            echo [FAIL] !FNAME!
        )
    )
)

echo.
echo !COUNT! 件リネームしました(日付: %TODAY%)

5. 連番(001_, 002_…)を付加してリネームする

フォルダを「001_alpha」「002_beta」のように連番付きの名前に整理したい場面があります。set /a で連番を計算し、0%NUM% のような形でゼロパディング(ゼロ埋め)した番号をフォルダ名に付加します。

@echo off
setlocal enabledelayedexpansion

set TARGET_DIR=C:\work
set NUM=1
set COUNT=0

:: フォルダを名前順に処理(3桁ゼロパディング: 001_, 002_, ...)
for /d %%F in ("%TARGET_DIR%\*") do (
    set FNAME=%%~nxF

    :: 3桁ゼロパディング(001〜999対応)
    set PADDED=00!NUM!
    set PADDED=!PADDED:~-3!
    set NEW_NAME=!PADDED!_!FNAME!

    if exist "%TARGET_DIR%\!NEW_NAME!\" (
        echo [SKIP] 既に存在: !NEW_NAME!
    ) else (
        ren "%%~fF" "!NEW_NAME!"
        if !ERRORLEVEL! equ 0 (
            echo [OK] !FNAME! → !NEW_NAME!
            set /a COUNT+=1
        ) else (
            echo [FAIL] !FNAME!
        )
    )
    set /a NUM+=1
)

echo.
echo !COUNT! 件リネームしました
ゼロパディングのテクニック: ~-3 でゼロ埋めを3桁に統一
set PADDED=00!NUM! で “001”, “0010” のような文字列を作り、set PADDED=!PADDED:~-3! で末尾3文字を取り出します。こうすることで 1→”001″、10→”010″、100→”100″ と常に3桁に整形できます。4桁対応にする場合は “0000” + ~-4 に変えるだけです。

6. プレフィックス・サフィックスを追加・削除する

6-1. すべてのフォルダに一括でプレフィックスを追加する

@echo off
setlocal enabledelayedexpansion

set TARGET_DIR=C:\work
set PREFIX=2024_

:: TARGET_DIR 直下のすべてのフォルダに PREFIX を追加
set COUNT=0
for /d %%F in ("%TARGET_DIR%\*") do (
    set FNAME=%%~nxF

    :: 既にプレフィックスが付いているフォルダはスキップ
    if "!FNAME:~0,5!"=="%PREFIX%" (
        echo [SKIP] 既にプレフィックス付き: !FNAME!
    ) else (
        set NEW_NAME=%PREFIX%!FNAME!
        if exist "%TARGET_DIR%\!NEW_NAME!\" (
            echo [SKIP] 既に存在: !NEW_NAME!
        ) else (
            ren "%%~fF" "!NEW_NAME!"
            if !ERRORLEVEL! equ 0 (
                echo [OK] !FNAME! → !NEW_NAME!
                set /a COUNT+=1
            ) else (
                echo [FAIL] !FNAME!
            )
        )
    )
)

echo.
echo !COUNT! 件リネームしました

6-2. 特定のプレフィックスを一括削除する

@echo off
setlocal enabledelayedexpansion

set TARGET_DIR=C:\work
set PREFIX=2024_
set PREFIX_LEN=5
:: ↑ PREFIX の文字数を手動でセット(2024_ = 5文字)

set COUNT=0
for /d %%F in ("%TARGET_DIR%\%PREFIX%*") do (
    set FNAME=%%~nxF
    :: プレフィックス部分を除いた名前を取得
    set NEW_NAME=!FNAME:~%PREFIX_LEN%!

    if "!NEW_NAME!"=="" (
        echo [SKIP] プレフィックスのみで名前が空になります: !FNAME!
    ) else if exist "%TARGET_DIR%\!NEW_NAME!\" (
        echo [SKIP] 既に存在: !NEW_NAME!
    ) else (
        ren "%%~fF" "!NEW_NAME!"
        if !ERRORLEVEL! equ 0 (
            echo [OK] !FNAME! → !NEW_NAME!
            set /a COUNT+=1
        ) else (
            echo [FAIL] !FNAME!
        )
    )
)

echo.
echo !COUNT! 件リネームしました

ファイル名の先頭にフォルダ名を付加するような応用的なリネームについては ファイル名の先頭にフォルダ名を一括で付ける方法完全ガイド も参照してください。

7. フォルダ名の文字列を部分置換する

バッチの変数展開 %VAR:old=new% を使うと文字列の一部を置換できます。ただしこの方法は大文字/小文字を区別しないため、大文字小文字を意識した厳密な置換や正規表現が必要な場合は PowerShell を使います。

7-1. バッチの変数展開で文字列を置換する(大文字小文字を区別しない)

@echo off
setlocal enabledelayedexpansion

set TARGET_DIR=C:\work
set OLD_STR=project
set NEW_STR=task

:: フォルダ名に "project" が含まれるフォルダを "task" に置換
set COUNT=0
for /d %%F in ("%TARGET_DIR%\*") do (
    set FNAME=%%~nxF
    :: 変数展開で置換(大文字小文字を区別しない)
    set NEW_NAME=!FNAME:%OLD_STR%=%NEW_STR%!

    :: 置換が発生した(名前が変わった)場合のみ処理
    if not "!FNAME!"=="!NEW_NAME!" (
        if exist "%TARGET_DIR%\!NEW_NAME!\" (
            echo [SKIP] 既に存在: !NEW_NAME!
        ) else (
            ren "%%~fF" "!NEW_NAME!"
            if !ERRORLEVEL! equ 0 (
                echo [OK] !FNAME! → !NEW_NAME!
                set /a COUNT+=1
            ) else (
                echo [FAIL] !FNAME!
            )
        )
    )
)

echo.
echo !COUNT! 件リネームしました

7-2. PowerShell を使って大文字小文字を区別した置換をする

@echo off
setlocal

set TARGET_DIR=C:\work
set OLD_STR=Project
set NEW_STR=Task

:: PowerShell に処理を委譲(大文字小文字を正確に区別して置換)
powershell -NoProfile -Command "
    $dir = '%TARGET_DIR%'
    $old = '%OLD_STR%'
    $new = '%NEW_STR%'
    $count = 0
    Get-ChildItem -Path $dir -Directory | ForEach-Object {
        $newName = $_.Name -creplace [regex]::Escape($old), $new
        if ($newName -ne $_.Name) {
            if (Test-Path (Join-Path $dir $newName)) {
                Write-Host "[SKIP] 既に存在: $newName"
            } else {
                Rename-Item -Path $_.FullName -NewName $newName
                Write-Host "[OK] $($_.Name) -> $newName"
                $count++
            }
        }
    }
    Write-Host "$count 件リネームしました"
"
バッチ変数展開の置換は大文字/小文字を区別しない
!FNAME:Project=Task! の置換は projectPROJECTProject のいずれにもマッチします(case-insensitive)。大文字/小文字を区別して置換したい場合(例: Project だけを対象にして project は変えない)は PowerShell の -creplace(case-sensitive replace)を使ってください。

8. ドライラン:実際には変更せず確認だけする

大量のフォルダを一括リネームする前に「何がどう変わるか」を確認したいことがあります。/dry フラグを使ってリネームをスキップするドライランモードを実装すると、安全に事前確認できます。

@echo off
setlocal enabledelayedexpansion

:: /dry 引数でドライランモード(実際には変更しない)
set DRY=0
if /i "%~1"=="/dry" set DRY=1

set TARGET_DIR=C:\work
set PREFIX=archive_

if !DRY!==1 (
    echo ===== ドライランモード(実際には変更しません) =====
) else (
    echo ===== 実行モード =====
)

set COUNT=0
for /d %%F in ("%TARGET_DIR%\*") do (
    set FNAME=%%~nxF
    set NEW_NAME=%PREFIX%!FNAME!

    if !DRY!==1 (
        echo [DRY] リネーム予定: !FNAME! → !NEW_NAME!
    ) else (
        if exist "%TARGET_DIR%\!NEW_NAME!\" (
            echo [SKIP] 既に存在: !NEW_NAME!
        ) else (
            ren "%%~fF" "!NEW_NAME!"
            if !ERRORLEVEL! equ 0 (
                echo [OK] !FNAME! → !NEW_NAME!
            ) else (
                echo [FAIL] !FNAME!
            )
        )
    )
    set /a COUNT+=1
)

echo.
echo 対象: !COUNT! フォルダ
if !DRY!==1 echo ^(ドライランのため実際には変更していません。/dry なしで再実行してください^)

:: 実行例:
::   確認のみ: batch.bat /dry
::   実際に実行: batch.bat

9. よくあるエラーと対策

エラー / 症状 原因 対策
指定されたファイルが見つかりません 変更元フォルダが存在しない、またはパス指定が間違っている if not exist "%TARGET%\" で事前チェック。カレントディレクトリを確認
ファイルまたはディレクトリが既に存在します 変更後の名前と同じフォルダ・ファイルが既に存在する if exist "%DIR%\%NEW%\" で事前チェックし、スキップまたはエラー処理
構文が正しくありません 新しい名前(第2引数)に \ が含まれている ren の第2引数はフォルダ名のみ(パス不可)。パスを含む移動は move を使う
リネームしたら別の名前に変わった 変数展開の置換で大文字/小文字の意図しないマッチが発生 バッチ置換は case-insensitive。大文字/小文字を区別したい場合は PowerShell の -creplace を使う
アクセスが拒否されました フォルダが別プロセスで使用中、または権限不足 フォルダを開いているアプリを終了させる。管理者権限でバッチを実行する
for /d ループ中に変数が展開されない enabledelayedexpansion が設定されていないため %VAR% がループ内で更新されない setlocal enabledelayedexpansion を宣言し、ループ内では !VAR! を使う

10. 実践例3本

実践例1:月別フォルダ名の YYYYMM を YYYY-MM 形式に変換する

「202501」「202502」のような年月フォルダを「2025-01」「2025-02」のようにハイフン区切りに一括変換するパターンです。?????? ワイルドカードで6文字のフォルダのみを対象に絞り込みます。

@echo off
setlocal enabledelayedexpansion

set TARGET_DIR=C:\archive

set COUNT=0
:: ?????? で6文字のフォルダ名のみにマッチさせる
for /d %%F in ("%TARGET_DIR%\??????") do (
    set FNAME=%%~nxF

    :: 年(先頭4文字)と月(5〜6文字目)を分離
    set YEAR=!FNAME:~0,4!
    set MONTH=!FNAME:~4,2!
    set NEW_NAME=!YEAR!-!MONTH!

    if exist "%TARGET_DIR%\!NEW_NAME!\" (
        echo [SKIP] 既に存在: !NEW_NAME!
    ) else (
        ren "%%~fF" "!NEW_NAME!"
        if !ERRORLEVEL! equ 0 (
            echo [OK] !FNAME! → !NEW_NAME!
            set /a COUNT+=1
        ) else (
            echo [FAIL] !FNAME!
        )
    )
)

echo.
echo !COUNT! 件リネームしました

実践例2:プロジェクトフォルダの連番を振り直す(ドライラン付き)

「001_alpha」「003_beta」「007_gamma」のように歯抜けになった 3桁連番+アンダースコア形式のフォルダを001 から詰めて振り直す実践パターンです。2ステップ方式(まず _orig_ プレフィックスで一時リネーム → 連番付け直し)で名前の衝突を防ぎます。

@echo off
setlocal enabledelayedexpansion

:: 前提: フォルダ名が "NNN_name" 形式(先頭4文字が 001_ などの連番)
set DRY=0
if /i "%~1"=="/dry" set DRY=1

set TARGET_DIR=C:\work\projects

if !DRY!==1 (
    echo ===== ドライランモード(確認のみ) =====
    set NUM=1
    for /d %%F in ("%TARGET_DIR%\*") do (
        set FNAME=%%~nxF
        :: 先頭4文字(001_)を除いた本体名
        set BODY=!FNAME:~4!
        if "!BODY!"=="" set BODY=!FNAME!
        set PADDED=000!NUM!
        set PADDED=!PADDED:~-3!
        echo [DRY] !FNAME! → !PADDED!_!BODY!
        set /a NUM+=1
    )
    echo.
    echo ^(/dry なしで再実行すると実際に変更されます^)
    exit /b 0
)

echo ===== 連番振り直し実行 =====

:: ステップ1: 全フォルダに一時プレフィックス _orig_ を付ける(名前衝突防止)
:: 例: 001_alpha → _orig_001_alpha
for /d %%F in ("%TARGET_DIR%\*") do (
    ren "%%~fF" "_orig_%%~nxF" >nul 2>&1
)

:: ステップ2: _orig_ プレフィックスを除いて本体名を取り出し連番を振り直す
:: "_orig_001_alpha" → ~6 で "_orig_" を除く → "001_alpha" → ~4 で連番を除く → "alpha"
set NUM=1
for /d %%F in ("%TARGET_DIR%\_orig_*") do (
    set FNAME=%%~nxF
    :: _orig_(6文字)を除いた元の名前
    set ORIG=!FNAME:~6!
    :: 元の連番(3桁+_(4文字))を除いた本体名
    set BODY=!ORIG:~4!
    if "!BODY!"=="" set BODY=!ORIG!
    set PADDED=000!NUM!
    set PADDED=!PADDED:~-3!
    ren "%%~fF" "!PADDED!_!BODY!" >nul 2>&1
    echo [OK] !FNAME:~6! → !PADDED!_!BODY!
    set /a NUM+=1
)

echo.
echo 処理完了

実践例3:CSV ログ付きで一括プレフィックスリネームする

一括リネームの前後の名前を CSV ファイルに記録しながらリネームするパターンです。リネーム後に「どのフォルダが何に変わったか」を確認・復元できるログを残せます。

@echo off
setlocal enabledelayedexpansion

set TARGET_DIR=C:\work
set PREFIX=done_
set LOGFILE=%TARGET_DIR%\rename_log.csv

:: ログファイルにヘッダーを書き込む
echo datetime,old_name,new_name,result > "%LOGFILE%"

set COUNT=0
set FAIL=0

for /d %%F in ("%TARGET_DIR%\*") do (
    set FNAME=%%~nxF

    :: 既にプレフィックスが付いているフォルダはスキップ
    if "!FNAME:~0,5!"=="%PREFIX%" (
        echo [SKIP] 既にプレフィックス付き: !FNAME!
    ) else (
        set NEW_NAME=%PREFIX%!FNAME!

        if exist "%TARGET_DIR%\!NEW_NAME!\" (
            echo [SKIP] 既に存在: !NEW_NAME!
            echo %date% %time%,!FNAME!,!NEW_NAME!,SKIP >> "%LOGFILE%"
        ) else (
            ren "%%~fF" "!NEW_NAME!"
            if !ERRORLEVEL! equ 0 (
                echo [OK] !FNAME! → !NEW_NAME!
                echo %date% %time%,!FNAME!,!NEW_NAME!,OK >> "%LOGFILE%"
                set /a COUNT+=1
            ) else (
                echo [FAIL] !FNAME!
                echo %date% %time%,!FNAME!,!NEW_NAME!,FAIL >> "%LOGFILE%"
                set /a FAIL+=1
            )
        )
    )
)

echo.
echo 完了: !COUNT! 件成功, !FAIL! 件失敗
echo ログ: %LOGFILE%

フォルダの作成については バッチファイルでフォルダを作成する方法完全ガイド、フォルダの一覧取得については バッチファイルで指定フォルダ配下のフォルダ一覧を取得する方法完全ガイド も参照してください。

11. まとめ:フォルダ名変更チートシート

やりたいこと コマンド / テクニック
フォルダ名を変更(基本) ren "C:\work\old" "new"
スペースを含む名前を変更 ren "C:\work\old name" "new name"(両方クォート)
複数フォルダを一括リネーム for /d %%F in ("dir\*") do ren "%%~fF" "新名"
名前に日付を付加 wmic で日付取得 → set NEW=!FNAME!_%TODAY%
3桁連番を付加 set P=00!N! & set P=!P:~-3!!P!_!FNAME!
プレフィックスを追加 set NEW=prefix_!FNAME!
プレフィックスを削除 set NEW=!FNAME:~5!(先頭5文字を除く)
文字列を置換(大文字小文字区別なし) set NEW=!FNAME:old=new!
文字列を置換(大文字小文字区別あり) PowerShell の -creplace を使う
ドライラン(確認のみ) if "%~1"=="/dry" フラグで ren をスキップ

FAQ

Qren コマンドで新しい名前にパスを指定するとエラーになります。

Aren コマンドの第2引数(新しい名前)にはフォルダ名だけを指定します。C:\archive\newname のようにパスを含めることはできません。「名前を変えながら別の場所に移動したい」場合は move "元パス" "移動先\新名" を使ってください。詳しくは フォルダを移動する完全ガイド を参照してください。

Qfor /d ループ内で変数が更新されません。!VAR! と %VAR% の違いは何ですか?

Asetlocal enabledelayedexpansion が有効な場合、ループ内で更新した変数は !VAR! で参照します。%VAR% はスクリプトが解析される時点で展開されるため、ループ内での変更が反映されません。ループ処理では必ず setlocal enabledelayedexpansion を宣言し、ループ内の変数参照には !VAR! を使ってください。

Qリネームしたら意図しない大文字/小文字のフォルダも変換されてしまいました。

Aバッチの変数展開 !FNAME:old=new! は大文字/小文字を区別しません(case-insensitive)。Project を置換しようとすると projectPROJECTProject すべてにマッチします。大文字/小文字を区別したい場合はセクション7-2で紹介したPowerShell の -creplace を使ってください。

Qfor /d でフォルダを処理中にリネームすると、ループが正しく動かないことがありますか?

Aはい、注意が必要です。for /d %%F in ("dir\*") は実行前にフォルダ一覧を取得します。ループ中にリネームしても一般的には問題ありませんが、リネーム後のフォルダがパターン(例: *)に再マッチする場合、二重処理が起きることがあります。安全のため、リネーム対象と一致するパターンとリネーム後の名前が重複しないように設計してください。

Qren コマンドで「アクセスが拒否されました」が出ます。

A主な原因は2つです。①フォルダ内のファイルが別のプロセスで使用中。②権限不足(システムフォルダや管理者専用フォルダへのアクセス)。①の場合はファイルを閉じてから再実行。②の場合はバッチファイルを右クリック→「管理者として実行」してください。

Q一括リネームを間違えてしまいました。元に戻す方法はありますか?

Aバッチの ren コマンドには自動的なアンドゥ機能はありません。対策として①実行前に CSV ログ(実践例3)を記録しておく、②ドライラン(/dry)で必ず確認してから本番実行する、③重要なフォルダはリネーム前にコピーをとっておく、の3点を徹底してください。ログがある場合は「新名」を「旧名」にリネームするバッチを CSV から生成することで復元できます。