Этот пакетный скрипт сделает это.
@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, текущее расширение пока отсутствует в списке и должно быть добавлено.
Линия эха в основном выводит, и я также заменяю свои заполнители ( :
) на новые строки, чтобы они выглядели хорошо.