2014年9月22日月曜日

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

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


できることイメージ

自信作です。

操作例


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

  1. :home
  2. REM 【1】まず引数1がフォルダか見分け、違うなら親フォルダフルパスを引数にサブルーチンを呼び出す。
  3. REM 【3】引数1がフォルダか見分け、フォルダなので次に進む
  4. dir /a:d "%~1"
  5. if %errorlevel%.==1. call :foldersyutoku "%~dp1"
  6.  
  7. REM 【7】もどってきてフラグたってるので処理にGO
  8. if %flag%.==1. goto syori
  9.  
  10. REM 【4】第1引数のフォルダ名を取得(これはかんたん!)
  11. set name=%~nx1
  12. REM 【5】2で呼び出したこのバッチを終了
  13. goto :EOF
  14.  
  15.  
  16. :syori
  17. REM 【8】後は簡単。名前変えて、フラグ消して頭に戻る。
  18. ren %1 "%name%_%~nx1"
  19. REM ren %1 "%name%%~nx1"
  20.  
  21. shift
  22.  
  23. If %1.==. goto :EOF
  24.  
  25. set flag=0
  26. goto home
  27.  
  28. :foldersyutoku
  29. REM 【2】カレントフォルダをファイルのある場所に一時的に変更し、このバッチをCDを引数にして実行する
  30. pushd %1
  31. Call "%~f0" "%CD%"
  32.  
  33. REM 【6】もどってきてフラグたててサブルーチンを終了する
  34. set flag=1
  35.  
  36.  


注意
指定ファイルが多すぎる場合やパスが長い場合は失敗する可能性があります。
(正確には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 件のコメント:

コメントを投稿