Этот пакетный скрипт сделает это.
@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
Сохраните его как любой .batфайл и запустите его с помощью команды batchfile(замените то, что вы назвали), чтобы отобразить текущий каталог, или укажите путь с помощью batchfile "path". Будет искать все подкаталоги.
Если вы хотите экспортировать в файл, используйте batchfile >filename.txt(или batchfile "path" >filename.txt).
объяснение
Все, что находится перед for /f...строкой, просто настраивает: он ищет целевой каталог для поиска, включает отложенное расширение, что позволяет мне обновлять переменные в цикле и определяет newline ( LF), который я могу использовать для более точного вывода. Да, и %~1означает «получить первый аргумент, удаляя кавычки», который предотвращает двойные кавычки - см for /?.
Цикл использует это dir /b /s /a:-d "%target%" команду, собирая список всех файлов во всех подкаталогах под целью.
%%~xiизвлекает расширение из полных путей, которые dirвозвращает команда.
Пустое расширение заменяется на «FileWithNoExtension», так что вы знаете, что такой файл существует - если я добавил пустую строку вместо этого, это не так очевидно.
Весь текущий список при отправке через findкоманду, чтобы обеспечить уникальность. Текстовый вывод команды find отправляется nul, по сути, в черную дыру - нам это не нужно. Поскольку мы всегда добавляем a :в конец списка, мы также должны убедиться, что поисковый запрос заканчивается на, :чтобы он не совпадал с частичными результатами - см. Комментарии.
% ERRORLEVEL% устанавливается findкомандой, значение 0 указывает на совпадение. Так что, если это не 0, текущее расширение пока отсутствует в списке и должно быть добавлено.
Линия эха в основном выводит, и я также заменяю свои заполнители ( :) на новые строки, чтобы они выглядели хорошо.