2014年9月22日月曜日

親フォルダ名を付加したファイル名にリネームするバッチ

複数のフォルダで対象ファイルが複数あり、名前がかぶらないようにしつつ、同じフォルダにまとめたい。こんなときにどうぞ。


できることイメージ

自信作です。

操作例


下記をバッチファイルで保存にしたうえで、対象ファイル(複数可)をドラッグ&ドロップします。
またはsendtoに保存してから送るで実行でも可。

:home
REM 【1】まず引数1がフォルダか見分け、違うなら親フォルダフルパスを引数にサブルーチンを呼び出す。
REM 【3】引数1がフォルダか見分け、フォルダなので次に進む
dir /a:d "%~1"
if %errorlevel%.==1. call :foldersyutoku "%~dp1"

REM 【7】もどってきてフラグたってるので処理にGO
if %flag%.==1. goto syori

REM 【4】第1引数のフォルダ名を取得(これはかんたん!)
set name=%~nx1
REM 【5】2で呼び出したこのバッチを終了
goto :EOF


:syori
REM 【8】後は簡単。名前変えて、フラグ消して頭に戻る。
ren %1 "%name%_%~nx1"
REM ren %1 "%name%%~nx1"

shift

If %1.==. goto :EOF

set flag=0
goto home

:foldersyutoku
REM 【2】カレントフォルダをファイルのある場所に一時的に変更し、このバッチをCDを引数にして実行する
pushd %1
Call "%~f0" "%CD%"

REM 【6】もどってきてフラグたててサブルーチンを終了する
set flag=1




注意
指定ファイルが多すぎる場合やパスが長い場合は失敗する可能性があります。
(正確には8192文字を超えたとき)

たとえば画像の例だと下記のようなコマンドを発行します。
"バッチ(フルパス)" "C:\For テスト\4月分\001.xls" "C:\For テスト\4月分\002.xls" "C:\For テスト\4月分\003.xls" "C:\For テスト\4月分\004.xls" "C:\For テスト\4月分\005.xls" "C:\For テスト\4月分\006.xls" "C:\For テスト\4月分\007.xls" "C:\For テスト\4月分\008.xls" "C:\For テスト\4月分\009.xls" "C:\For テスト\4月分\010.xls" "C:\For テスト\4月分\011.xls" "C:\For テスト\4月分\012.xls" "C:\For テスト\4月分\013.xls" "C:\For テスト\4月分\014.xls" "C:\For テスト\4月分\015.xls"
この文字数が8192を超えると機能上の限界により、失敗します。
上記の引数のみで375文字です。

フルパスですし割とすぐに上限に達しますので要注意です。
(テンポラリに一時的にリストを作成することも可能ですが、1ファイルで完結する気軽さを優先してます。)

参考:コマンド プロンプト (Cmd.exe) へ 8192 文字以上の引数を渡した場合に発生する現象」」


謝辞
ファイルの名前の前に、親フォルダの名称を自動的に付ける - バッチもん研究所 blogこちらのサイトを大変参考にさせていただきました。

なお、違いはファイルごとに処理ができるところです。
このため「Windowsの検索結果から複数の場所に存在するファイルを一度にリネームする」といったことが可能です。

0 件のコメント:

コメントを投稿