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