Categories: others

WIndowsのバッチ(bat)ファイルを使ってフォルダ内のファイルのリストを作成する(Forループ編)

最近、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文を使った方が様々な用途に対応できることが多いため、こちらを使うことが多いです。

バッチファイルを上手く使いこなして作業を効率化したいところです。

Haruoka