0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

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

では!

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?