【bat】指定した拡張子のファイルのみ取得する方法(複数指定OK)

bat

batのループを使用して、フォルダ配下から指定した拡張子のファイルを取得する方法を説明します。

1つの拡張子を指定する

まずは拡張子1つを指定するケースです。指定したフォルダパス配下にあるtxtファイルのファイル名を一覧で出力しています。

@echo off
setlocal enabledelayedexpansion

rem 対象のフォルダ
set inDir=D:\code\bat\IN

rem 拡張子1つ指定(.txt)
for /f "usebackq delims==" %%i in (`dir !inDir!\*.txt /a-d /b /s`) do (
  set fileName=%%~nxi
  echo ファイル名(拡張子あり):!fileName!
)

endlocal
pause

複数の拡張子を指定する

【基本編】複数の拡張子を指定する

続いて複数の拡張子を指定する方法です。

ポイントはdir パス\*.txt,パス\*.csv,...のように対象のパスとその拡張子をカンマ区切りで指定することです。ちなみに*.txtの*の部分は全てのテキストファイルを指定するという意味です。(このような指定の仕方を「ワイルドカード」と言います。)

@echo off
setlocal enabledelayedexpansion

set inDir=D:\code\bat\IN

rem 複数の拡張子を指定(.txtと.csv)
for /f "usebackq delims==" %%i in (`dir !inDir!\*.txt,!inDir!\*.csv /a-d /b /s`) do (
  set fileName=%%~nxi
  echo ファイル名(拡張子あり):!fileName!
)
endlocal
pause

【応用編】複数の拡張子を指定する

基本編の記述の場合、指定したい拡張子が増えると記述が長くなり、可読性が悪くなるというデメリットがあります。

その解決策として、拡張子が増えても記述が長くならないようにdirコマンドの部分を別で記述する方法があります。

@echo off
setlocal enabledelayedexpansion

set inDir=D:\code\bat\IN

rem 対象の拡張子をカンマ区切りで指定
set extList=txt,csv,pdf,jpg

for %%a in (!extList!) do (
 if DEFINED targetFiles (
  set targetFiles=!targetFiles!,!inDir!\*.%%a
 ) else (
  set targetFiles=!inDir!\*.%%a
 )
)

rem 上で定義したtargetFilesをdirコマンドのパラメータとして指定
for /f "usebackq delims==" %%i in (`dir !targetFiles! /a-d /b /s`) do (
  set fileName=%%~nxi
  echo ファイル名(拡張子あり):!fileName!
)
endlocal
pause

ではサンプルとして4つの拡張子を指定しています。

基本の記述でdir パス\*.txt,パス\*.csv,...と手書きしていた部分をtargetFiles変数に割当てています。

このtargetFiles変数をdirコマンドのパラメータとすることで、基本の記述と同じ結果になりつつ、可読性も高めることができます。

拡張子を問わず、全てのファイルを指定する

最後に全てのファイルを取得する方法を記載します。先ほど*.txtと記述していた箇所を*.*に変更してください。

@echo off
setlocal enabledelayedexpansion

set inDir=D:\code\bat\IN

for /f "usebackq delims==" %%i in (`dir !inDir!\*.* /a-d /b /s`) do (
  set fileName=%%~nxi
  echo ファイル名(拡張子あり):!fileName!
)
endlocal
pause

フルパスやフォルダパスも取得する

この記事では拡張子ありのファイル名のみ一覧で出していますが、他にファイルのフルパスやファイルが配置されているフォルダパスを知りたいという方は、以下の記事でまとめていますので、ぜひ参考にされてください。

【bat】ファイルパスからファイル名、フォルダパス、フォルダ名などを取得する方法

ぜひお試しください!

コメント