バッチファイルで親フォルダ内の子フォルダのファイルを一括でリネームする

こんてんつ

親フォルダ内の子フォルダに存在するファイルを、「親フォルダ名+連番」でリネームするバッチファイルのコードを示す。以下の.batファイルを親フォルダ内に置いて実行することで、ファイル名を変更することが出来る。

コード

例題

下記のフォルダの中に、テスト用のファイルとバッチファイルを用意する。

これを、下記の様に「親フォルダ名+連番」でリネームする。

サマリー

@echo off
setlocal enabledelayedexpansion

:: 現在のディレクトリを表示
echo ##### ##### ##### WARNING !!!!! ##### ##### #####
echo ##### ##### ##### WARNING !!!!! ##### ##### #####
echo ##### ##### ##### WARNING !!!!! ##### ##### #####
echo.
echo Current Directory is 
echo %CD%
echo.

:: 確認メッセージを表示
echo Can I execute? [y/n]
set /p "confirm="

echo.

if /i "%confirm%"=="y" (
    :: 初期化
    set "lastParent="
    set "count=0"

    :: 全てのファイルに対して繰り返し処理を行う
    for /r %%i in (*) do (
        if not "%%~nxi"=="%~nx0" ( :: .batファイル自身のリネームを回避
        echo I will rename %%~nxi :: 確認用
            :: 親フォルダ名を取得
            set "parent=%%~dpi"
            set "parent=!parent:~0,-1!"   :: 末尾の\を除去
            for %%j in ("!parent!") do set "parent=%%~nj"   :: フォルダ名だけにする

            :: 親フォルダが変わった場合はカウントをリセットする
            if not "!parent!"=="!lastParent!" set "count=1"

            :: リネームする際の接頭辞と接尾辞を設定
            set "prefix=!parent!_"
            set "suffix=%%~xi"

            :: 0埋めして連番を設定
            set "number=!count!"
            if !count! LSS 100 set "number=0!count!"
            if !count! LSS 10 set "number=00!count!"

            :: 新しいファイル名を作成
            set "newName=!prefix!!number!!suffix!"

            :: ファイルをリネーム
            ren "%%i" "!newName!"

            :: カウントを更新
            set /a "count+=1"
            set "lastParent=!parent!"
        )
    )
    echo Finished.
) else (
    echo Canceled.
)

pause

解説

変数の設定

  • set "lastParent=":前回処理したファイルの親フォルダ名を記憶する変数。

for文によるすべてのファイルへの処理

  • for /r %%i in (*) do (for /r/rは「サブディレクトリを再帰的に処理する」という意味のオプション。指定されたディレクトリ以下のすべてのサブディレクトリについて、forコマンドで処理を繰り返す。

親フォルダ名の取得

  • set "parent=%%~dpi"parent変数に現在のファイルの親フォルダまでのフルパスを取得。%%~dpiは、%%i変数のドライブ名とディレクトリ名を表し、~dpはドライブ名とディレクトリ名を抽出するための修飾子。
  • for %%j in ("!parent!") do set "parent=%%~nj":このままではparent変数がフルパスなので、親フォルダ名だけにするコマンド。set "parent=%%~nj"は、%%j変数に格納されたフルパスから、親フォルダ名のみを抽出してparent変数に設定できる。

リネームの設定

  • set "prefix=!parent!_":「親フォルダ名+_(アンダーバー)」として定義しておく。
  • set "suffix=%%~xi":suffixを%%iの拡張子として定義する。%%~xiは%%iの拡張子を表す。
  • set "newName=!prefix!!number!!suffix!"ren "%%i" "!newName!":これによって、ファイル%%inewNameにリネームする。

未解決問題

echo I will rename %%~nxi :: 確認用を省略した場合、何故か「指定されたドライブが見つかりません。」というメッセージが出てくる(動作には問題が無い)。原因が分かる方がいらっしゃいましたら、ご教示いただけますと幸いです。