最近、Windowsのバッチファイルを使う機会が大変多いです。
C++とかでプログラムを書くよりも簡単に、サクっと書けてしまうので、状況によってはかなり力を発揮します。
今回は、バッチファイルを用いた特定フォルダのファイルリストの作成を行ってみたいと思います。
まずバッチファイルの作り方ですが、普通にテキストファイルを作成し、拡張子を「.bat」に変えてしまいましょう。
その後、.batファイル上で右クリックして「編集」で中身を編集することができます。
実験用に以下のようなフォルダを作りました。
このfilesディレクトリのファイルリストを作ることを考えてみます。バッチファイルの位置は、filesの1階層上のbatフォルダ内としました。
作成したバッチファイル(createFileList.bat)は以下となります。
REM 既にfilelist.txtがある場合には削除する if exist filelist.txt del filelist.txt REM for文にてファイルを検索する for %%f in (.\files\*.*) do ( echo %%f >> filelist.txt ) pause
「.\files\*.*」の部分は、最初の「.」がカレントディレクトリ(batファイルの置かれているディレクトリ)を示すので、batファイルの置かれているフォルダにあるfilesというフォルダを参照してくださいということを示しています。
加えて、「*.*」は「*」の部分に何が入っても良いということを示しており、「.」はファイル名と拡張子を分ける区切りです。
要するに、どんな名前でも、どんな拡張子でも探してリスト化します。
結果、以下のような出力結果になります。
.\files\00000.png .\files\00001.png .\files\00002.png .\files\001.txt .\files\002.txt .\files\003.txt .\files\004.txt .\files\005.txt .\files\aaa.JPG .\files\bbb.JPG .\files\ccc.JPG .\files\ddd.JPG .\files\eee.JPG
これだと、カレントディレクトリからの相対パスが書き込まれます。
こういう書き込み方をしたいケースも結構あるとは思うのですが、純粋にファイル名だけ欲しいというケースもあると思います。
以下のように書きました。
REM 既にfilelist.txtがある場合には削除する if exist filelist.txt del filelist.txt REM for文にて特定拡張子のファイルを検索する for %%f in (.\files\*.*) do ( echo %%~nxf >> filelist.txt ) pause
結果は以下のようになります。
00000.png 00001.png 00002.png 001.txt 002.txt 003.txt 004.txt 005.txt aaa.JPG bbb.JPG ccc.JPG ddd.JPG eee.JPG
ここも軽く解説すると、「%%~nxf」と記述することで、「.\files\」の部分がなくなり、ファイル名のみになります。
「%%f」に対して、「~nx」を指定することでファイル名と拡張子名のみを取り出すことができます。ちなみに「~n」のみだとファイル名のみが、「~x」のみだと拡張子名のみを取り出すことができます。
抽出したい拡張子が一種類だけであれば、以下の書き方でOKです。
REM 既にfilelist.txtがある場合には削除する
if exist filelist.txt del filelist.txt
REM for文にて特定拡張子のファイルを検索する
for %%f in (.\files\*.png) do (
echo %%~nxf >> filelist.txt
)
pause
png拡張子のファイルのリストが作成されます。
00000.png 00001.png 00002.png
最後にJPGとpngのように複数の拡張子を取り出したい場合のバッチファイルを紹介します。
REM 既にfilelist.txtがある場合には削除する if exist filelist.txt del filelist.txt REM for文にて特定拡張子のファイルを検索する for %%f in (.\files\*.*) do ( if "%%~xf"==".png" ( echo %%~nxf >> filelist.txt ) else if "%%~xf"==".JPG" ( echo %%~nxf >> filelist.txt ) ) pause
大量の拡張子を指定したいとなると別な方法を考えた方がいい気がしますが、数個程度であればelse ifを使って羅列しちゃうのが一番簡単で楽な気がします。
ちょっと(3)でも触れましたが、「%%~xf」は「%%f」から拡張子部分のみを取り出します。それが各拡張子の名前に一致していれば、if文の中が実行される流れとなります。
これを叩くと以下のような出力になります。
00000.png 00001.png 00002.png aaa.JPG bbb.JPG ccc.JPG ddd.JPG eee.JPG
初めてバッチファイル関連の記事を作ってみました。
他にもdirコマンドでファイルリストを作る方法などもありますが、基本的にfor文を使った方が様々な用途に対応できることが多いため、こちらを使うことが多いです。
バッチファイルを上手く使いこなして作業を効率化したいところです。