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】ファイルパスからファイル名、フォルダパス、フォルダ名などを取得する方法
ぜひお試しください!
コメント