ここでは下の図のように、複数あるファイル名の一部を一括して変換するバッチファイルを紹介します。
まず、はじめに複数のファイルの拡張子を一括して変換する方法。そして、複数のファイルの共通しているファイル名部分を一括して変換する方法です。
その他の関連しそうな記事
拡張子だけを一括変換する
まずは、拡張子だけを一括して変換する場合です。
例えば、以下の
test_1.txt
test_2.txt
test_3.txt
…
のようなtxtファイルがあったとき、これを
text_1.dat
text_2.dat
text_3.dat
…
のようにdatファイルに一括して変更を行いたいときは、以下のようなバッチファイル「rename_extension.bat」となります。
1 |
rename *.txt *.dat |
「rename」は既に登場した「ファイル名を変更する」コマンドでした。「rename」コマンドの引数として、ファイル名部分にワイルドカード「*」を使用して変更前の拡張子(*.txt)と変更後の拡張子(*.dat)を指定してやればよいだけです。
実際に「第11章」フォルダ内に作成し、バッチファイルを実行してみましょう。上記のバッチファイル(rename_extension.bat)を作ったら、ファイル名の変更対象となるファイル群、
test_1.txt
test_2.txt
test_3.txt
test_4.txt
を作って、バッチファイルを実行してみてください。4つ全てのファイルの拡張子が「.dat」に変更されれば成功です。
このように、拡張子を一括して変換するのは非常に簡単なコマンドで実現できます。もし、元のファイル名も残したい場合は「rename」コマンドの代わりに「copy」コマンドを使えばよいでしょう。
共通しているファイル名部分を一括して変換する
次に、
test_1.txt
test_2.txt
test_3.txt
…
のようなファイルがあったときに、
sample_1.txt
sample_2.txt
sample_3.txt
…
のように、ファイル名の共通している部分を一括して、変換するバッチを作成します。
拡張子ではなくファイル名を一括変換するのは多少複雑になります。このような操作をするコマンドが用意されておらず、自分で作る必要があるからです。
まず、ファイル名の変更対象となるファイル群を再び作りましょう。以下のファイルを「第11章」フォルダの下に作って下さい。
test_1.txt
test_2.txt
test_3.txt
test_4.txt
以下のバッチファイルがファイル名を一括変換するプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@echo off for %%a in (*.txt) do ( echo %%a >> filename.txt ) setlocal ENABLEDELAYEDEXPANSION for /f "tokens=1,2 delims=_" %%a in (filename.txt) do ( rename %%a_%%b %1_%%b ) end local del filename.txt |
実行コマンドは
1 |
rename_filename.bat sample |
と引数に変更後の文字列を指定します。
プログラムの3行目から5行目の「for %%a in …」で、まず変換したいファイル名を一時的に「filename.txt」ファイルに書き出しています。ここでは、すべてのtxtファイルを対象としていますので、この場合「filename.txt」には、
test_1.txt
test_2.txt
test_3.txt
test_4.txt
と出力されます。
次に、7行目から11行目のforループでオプション「delims=_」を指定し、ファイル名を「_」で区切った文字列を「filename.txt」から取り出しています。「_」で分割された文字列はループを回りながら「%%a」と「%%b」に、
%%a ⇒ text, %%b ⇒ 1.txt
%%a ⇒ text, %%b ⇒ 2.txt
%%a ⇒ text, %%b ⇒ 3.txt
のように代入されていきます。(※このあたりの「for」コマンドに関しては、「入門講義【第9章】 ファイル内の文字列を置換」を参照して下さい。)
そして、「rename」コマンドを使ってファイル名の変更をしますが、名前を変更するファイル名は「%%a_%%b」、すなわち「text_?.txt(?には1,2,…が入る)」を指定し、名前変更後のファイル名は「%1」を使って「%1_%%b」とします。この「%1」には、バッチファイル実行時に引数として指定した文字列「sample」が入っています。
最後に一時ファイルである「filename.txt」を削除して完成です(13行目)。
元のファイル(test_?.txt)も残したい場合には、9行目の
1 |
rename %%a_%%b %2_%%b |
を
1 |
copy %%a_%%b %2_%%b |
と置き換えればよいでしょう。
これで、ファイル名の一括置換バッチは出来上がりました…が、これを使うには条件があります。「delims=_」を使って「_」でファイル名を分割しているため、「_」でファイル名が区切られているものにしか対応していません。
「text-1.txt」といった「-」で区切られているものには「delims=-」とコードを変更すれば使えるようになるのですが、「text1.txt」など区切り文字が使われていないものには使うことができません。
そのあたりの汎用性もバッチファイルを作る上では重要な要素ですので、是非考えてみて下さい。
第11章のまとめ
本章では、ファイル名を一括して変更するバッチファイルを作成しました。
拡張子を一括変換するプログラムは簡単でしたが、ファイル名の一部を一括して変換するプログラムは多少複雑で工夫が必要でした。
ここで作ったバッチファイルでは対応できないファイル名も存在するため、自分が対象にするファイル名に合わせてバッチファイルを編集してみてください。
【入門講義 第11章のまとめ】
- その1 拡張子を一括変換するには、「rename *.txt *.dat」。
- その2 ファイル名の一部を一括変換するには、「for」文をうまく利用して作る。
なにか不明な点やうまくいかない場合は、「お問い合わせフォーム」からお気軽にお問い合わせ下さい。
次章では、コメントアウトという機能を説明します。これは何か機能を持ったものではなく、プログラムのメモ書きなどに使われるもので、直接処理に影響するものではありません。しかし、プログラムを作成するときには必須の機能です。
お礼とサンプルコード
動画のおかげで,バッチファイルを学ぶことができました.本だとなかなか理解が進まなかったので,大変ありがたかったです.バッチファイルの解説動画は,あまりありませんし,しかも体系立ててシリーズで講義してくれるものは解析チャンネルさんのものだけでした.講座の構成を考えて動画を撮るのは本当に手がかかると思います.本当にありがとうございました.おかげさまで,業務に使えるレベルのバッチファイルも構想できるようになりました.コマンドプロンプトというキーワードで検索していたのですが,たまたまYouTubeで出会えて幸運でした.
講座の中で習った別のコードでも置換できましたので,その報告です.
————————–
setlocal enabledelayedexpansion
for %%a in (*.txt) do (
set myFileName=%%a
set myFileName=!myFileName:%1=%2!
rename %%a !myFileName!
)
endlocal
—————————