Tập lệnh này sẽ làm điều đó.
@echo off
set target=%~1
if "%target%"=="" set target=%cd%
setlocal EnableDelayedExpansion
set LF=^
rem Previous two lines deliberately left blank for LF to work.
for /f "tokens=*" %%i in ('dir /b /s /a:-d "%target%"') do (
set ext=%%~xi
if "!ext!"=="" set ext=FileWithNoExtension
echo !extlist! | find "!ext!:" > nul
if not !ERRORLEVEL! == 0 set extlist=!extlist!!ext!:
)
echo %extlist::=!LF!%
endlocal
Lưu nó dưới dạng bất kỳ .bat
tệp nào và chạy nó bằng lệnh batchfile
(thay thế bất cứ thứ gì bạn đặt tên cho nó) để liệt kê thư mục hiện tại hoặc chỉ định đường dẫn bằng batchfile "path"
. Nó sẽ tìm kiếm tất cả các thư mục con.
Nếu bạn muốn xuất thành tệp, sử dụng batchfile >filename.txt
(hoặc batchfile "path" >filename.txt
).
Giải trình
Mọi thứ trước khi for /f...
dòng chỉ thiết lập mọi thứ: nó lấy thư mục đích để tìm kiếm, cho phép mở rộng bị trì hoãn cho phép tôi thực hiện cập nhật các biến trong vòng lặp và xác định một dòng mới ( LF
) mà tôi có thể sử dụng cho đầu ra gọn gàng hơn. Ồ, và %~1
có nghĩa là "lấy đối số đầu tiên, xóa dấu ngoặc kép" để ngăn dấu ngoặc kép tăng lên - xem for /?
.
Vòng lặp sử dụng dir /b /s /a:-d "%target%"
lệnh đó , lấy một danh sách tất cả các tệp trong tất cả các thư mục con bên dưới mục tiêu.
%%~xi
trích xuất phần mở rộng ra khỏi đường dẫn đầy đủ mà dir
lệnh trả về.
Một tiện ích mở rộng trống được thay thế bằng "FileWithNoExtension", vì vậy bạn biết có một tệp như vậy - nếu tôi đã thêm một dòng trống thay thế, nó không hoàn toàn rõ ràng.
Toàn bộ danh sách hiện tại nếu được gửi qua một find
lệnh, để đảm bảo tính duy nhất. Đầu ra văn bản của lệnh find được gửi tới nul
, về cơ bản là một lỗ đen - chúng tôi không muốn nó. Vì chúng tôi luôn nối thêm :
vào cuối danh sách, chúng tôi cũng nên đảm bảo truy vấn tìm kiếm kết thúc bằng một :
kết quả không khớp với một phần kết quả - xem bình luận.
% ERRORLEVEL% được đặt bởi find
lệnh, giá trị 0 cho biết có khớp. Vì vậy, nếu không phải là 0, thì phần mở rộng hiện tại không có trong danh sách và nên được thêm vào.
Dòng echo về cơ bản là đầu ra và tôi cũng thay thế trình giữ chỗ của tôi ( :
) bằng các dòng mới để làm cho nó trông đẹp hơn.