Notes_JP

あまり知られていないこと

【まとめ】バッチファイルによるファイル名一括変更

f:id:IsThisAPen:20171209221538p:plain:w400

バッチファイルで「フォルダ内のファイルの名前」を一括変更する方法を紹介します.
検索してもまとまった記事がなかったので,まとめてみました .

ファイル名の切り出し

例1:拡張子が".txt"である全ファイル名の頭2文字を削除 (abcde.txt→cde.txt)
for %%F in (*.txt) do call :sub "%%F"
goto :EOF

:sub
  set BEFORE=%~1
  set AFTER=%BEFORE:~3%
  ren "%BEFORE%" "%AFTER%"
goto :EOF

変数

  • BEFORE: もとのファイル名
  • AFTER: 変更後のファイル名

解説

  1. %~I: 全ての引用句"を削除して%Iを展開
    • ここでは,「"%%F"⇒%%F」となる.
  2. 部分参照: %環境変数:~[-]開始オフセット[,[-]長さ]%

部分参照 意味 X文字のとき
%I:~m% 文頭のm文字目を除く文字列 (m+1)~X
%I:~m,n% 文頭のm文字目を除く文字列から,最初のn文字 (m+1)~(m+n)
%I:~m,-n% m文字目以降から最後のn文字を除く文字列 (m+1)~(X-n)
%I:~-m% 最後のm文字 (X-m+1)~X
%I:~-m,n% 末尾よりm文字目からn文字 (X-m+1)~(X-m+n)
%I:~m,-n% 末尾よりm文字目以降から最後のn文字を除く文字列 (X-m+1)~(X-n+1)

例2:例1の改良版:拡張子の編集を防ぐ

上の例では,文字数を間違えると「拡張子」までリネームされる可能性がある.
これを避けるには,以下のように「拡張子を除くファイル名(以下のFILENAME)」だけを編集すれば良い.

for %%F in (*.txt) do call :sub "%%F"
goto :EOF

:sub
  set BEFORE=%~1
  set FILENAME=%~n1
  set EXTENSION=%~x1
  set AFTER=%FILENAME:~3%%EXTENSION%
  ren "%BEFORE%" "%AFTER%"
goto :EOF

変数

  • BEFORE: もとのファイル名
    • FILENAME: 拡張子を除くファイル名
    • EXTENSION: 拡張子
  • AFTER: 変更後のファイル名

解説

  1. %~nI: %Iをファイル名に展開
  2. %~xI: %Iを拡張子に展開

文頭への文字列付加

例:拡張子が".txt"である全ファイル名の文頭に文字列"prefix"を加える(abc.txt→prefixabc.txt)
for %%F in (*.txt) do ren "%%F" "prefix%%F"

末尾への文字列付加

例:拡張子が".txt"である全ファイル名の末尾に文字列"suffix"を加える(abc.txt→abcsuffix.txt)
for %%F in (*.txt) do ren "%%F" "%%~nFsuffix%%~xF"

応用例 (「ファイル名の切り出し,文頭・末尾への文字列追加」を全て用いる)

単に組み合わせるなら,上のコードを並べるだけです.
ここでは,もう少し実用的な例を紹介します.

例:「①フォルダを作成→②作成フォルダにファイルをコピー→③ファイル名を変更」

実際は「ファイル名を上書きするのは怖い」はずです.
というのも,間違った処理をしてしまえば,フォルダの中のファイル名が意図しない名前に上書きされてしまうからです.

実用的には,バックアップを取ってから処理を行いたいですね.
そうすれば,失敗しても新規に作成した方を削除すれば済むわけです.


従って,

  • 別なフォルダにコピーしてからファイル名を変更したい.
  • この時作成するフォルダ名は,自動でつけるが,絶対に他と被らない物が良い.

はずです.


以下の記事で,この処理を実現するバッチファイルを作成しました.
参考にして下さい.
wpqtqpqp.hatenablog.com