ドラッグ&ドロップでファイル名を変更するバッチファイルの作り方

複数のファイルをドラッグ&ドロップすると、ルールに従ってファイル名を変更するバッチファイルを作った。

ファイル名の先頭に「hoge_」を追加する

for %%F in (%*) do ren "%%~nxF" "hoge_%%~nxF"

ファイル名の末尾に「_fuga」を追加したいときは「hoge_%%~nxF」の部分を「%%~nF_fuga%%~xF」のように書く。

「~nx」などは渡された引数ひきすう(ここではフルパスつきのファイル名)からファイル名や拡張子を取り出すもの。ほかにもたとえばこんな指定ができるそうだ。

%~a
変数aから引用符(")を削除
%f
変数の中のフルパスつきのファイル名
%d
変数の中のドライブ名
%p
変数の中のフルパス
%n
変数の中のファイル名
%x
変数の中の拡張子
%a
変数内のファイルのファイル属性
%t
変数内のファイルのタイムスタンプ
%z
変数内のファイルのサイズ

ファイル名の一部を削除し、特定の桁に文字を追加したり特定の桁の文字を削除したりする

「IMG_20201011_120000.jpg」というファイル名を「2020-10-11 12.00.00.jpg」というファイル名にしたい。いろいろ調べてこういう内容になった。

for %%F in (%*) do call :sub %%F
exit /b

:sub
set fname=%~n1
set ext=%~x1
set y=%fname:~4,4%
set m=%fname:~8,2%
set d=%fname:~10,2%
set h=%fname:~13,2%
set mm=%fname:~15,2%
set s=%fname:~17,2%
set after=%y%-%m%-%d% %h%.%mm%.%s%%ext%
ren %1 "%after%"
goto :EOF

「%変数名:~a,b%」は「変数の先頭からa文字を削り、残った文字列からb文字を取り出す」というもの。ほかにもこんな指定ができるそうだ。

%変数名:~a%
変数の先頭からa文字を削った残り
%変数名:~a,b%
変数の先頭からa文字を削り、残った文字列の先頭からb文字(上のバッチファイルで使用)
%変数名:~a,-b%
変数の先頭からa文字を削り、残った文字列の最後からb文字を削った残り
%変数名:~-a%
変数の最後からa文字
%変数名:~-a,b%
変数の最後からa文字を取り出し、残った文字列の先頭からb文字
%変数名:~-a,-b%
変数の最後からa文字を取り出し、残った文字列の最後からb文字を削った残り

ファイル名の特定の文字列を置換する

「2020」を「2021」にしたいときは「set 変数名=%変数名:2020=2021%」のように書く。

for %%F in (%*) do call :sub %%F
exit /b

:sub
set fname=%~n1
set ext=%~x1
set fname=%fname:2020=2021%
ren %1 "%a%%ext%"
goto :EOF

バッチファイルではなくリネームソフトを使う

何度も同じリネームをするなら上のようなバッチファイルを作っておくのがよいが、今リネームソフトってどんなのがあるのかな。

Windows用のリネームソフトといえば定番の「Flexible Renamer」がある。正規表現での置換や連番の付与ができたりして高機能だが、ファイル名の一覧のリフレッシュが遅くてちょっと使いづらい。

使い慣れているテキストエディタがあれば、その検索/置換機能を使ってファイル名の一覧を編集し、その内容に従ってリネームするソフトがある。「E-Rename」をよく使っていたがファイル名の長さが256バイトを超えるとリネームできない。

【無料】リネームのソフト一覧 - 窓の杜」を見たら同じようなソフトとして「LiName」が紹介されていた。作者のページもある。ファイルをドラッグ&ドロップして「リネーム」ボタンをクリックすると、ファイル名の一覧が書かれたテキストファイルが開かれる。ファイル名を編集して閉じるとリネームされる。長いファイル名もリネームできる。これからはこちらも使おう。

関連記事

参考にしたページ

追記

作ったバッチファイルを「送る」から実行できるようにするときのちょっと便利な方法について書きました。