バッチファイルでファイルを退避する(ファイル名末尾に「(1)」を付加する)


Y子です。
ちょっとファイルを「どけておく」という作業、よくやりますよね。
新しいファイルをこのフォルダに置きたいけど、同名の既存ファイルに上書きして失いたくないから、ちょっとリネームしておく、という作業。
そんな時に使える処理を作ってみました。

概要・用途

test.txt」を、「test (1).txt」にリネームします。
ただし、同名のファイル名がすでにある場合は、数字をどんどん増やして、空いているファイル名を探します。

ファイル名を変えてファイルをどけておくような用途を想定します。
「zip圧縮をする際に、同名のzipファイルが既にある場合は、リネームしておく」など。
確認環境:Windows 10 Home (Bld. 19042.928)

コード

evacuate_file.bat
@echo off
setlocal

rem 引数がない場合は終了する
if "%~1"=="" (echo 引数がありません & pause & exit /b)

rem 変更前のファイル名(フルパス)「C:\work dir\test.txt」
set str_oldfile=%~1

rem フォルダのフルパス「C:\work dir\」
set str_dir=%~dp1

rem ファイル名分割…拡張子なし「test」と拡張子のみ「.txt」
set str_new_fn=%~n1
set str_new_ex=%~x1

rem カウンタ初期化
set cnt=1

:label_top

rem 新しいファイル名(仮)「test (n).txt」
set str_newfile=%str_new_fn% (%cnt%)%str_new_ex%

rem 同名のファイルがある場合は、次のファイル名を探す「test (n+1).txt」
if exist "%str_dir%%str_newfile%" (
  set /a cnt+=1
  goto :label_top
)

rem 新しいファイル名を確定する
ren "%str_oldfile%" "%str_newfile%"
echo リネームしました:%str_newfile%

endlocal
実行結果
> evacuate_file.bat "C:\work dir\test01.txt"
リネームしました:test01 (1).txt

> evacuate_file.bat "C:\work dir\test01.txt"
リネームしました:test01 (2).txt

おわりに

リネーム先のファイル名を、目で見て確認するのは簡単です。
でも、自動処理の中でファイルをどけたいときは、専用の処理を用意しておくと便利そうですね。

では!