Esse script em lote fará isso.
@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
Salve-o como qualquer arquivo .bat
e execute-o com o comando batchfile
(substitua o que você nomeou) para listar o diretório atual ou especifique um caminho com batchfile "path"
. Ele pesquisará todos os subdiretórios.
Se você deseja exportar para um arquivo, use batchfile >filename.txt
(ou batchfile "path" >filename.txt
).
Explicação
Tudo antes da linha for /f...
apenas define as configurações: ele faz o diretório de destino pesquisar, permite a expansão atrasada o que me permite atualizar variáveis no loop e define uma nova linha ( LF
) que eu posso usar para saída mais nativa. Ah, e o %~1
significa "pegue o primeiro argumento, removendo as aspas", o que evita aspas duplas - veja for /?
.
O loop usa o comando dir /b /s /a:-d "%target%"
, pegando uma lista de todos os arquivos em todos os subdiretórios abaixo do alvo.
%%~xi
extrai a extensão dos caminhos completos que o comando dir
retorna.
Uma extensão vazia é substituída por "FileWithNoExtension", então você sabe que existe tal arquivo - se eu adicionei uma linha vazia, não é tão óbvio.
Toda a lista atual, se enviada por meio de um comando find
, para garantir a exclusividade. A saída de texto do comando find é enviada para nul
, essencialmente um buraco negro - não o queremos. Como sempre adicionamos :
no final da lista, também devemos garantir que a consulta de pesquisa termine com :
, para que ela não corresponda aos resultados parciais, consulte os comentários.
% ERRORLEVEL% é definido pelo comando find
, um valor de 0 indica que houve uma correspondência. Portanto, se não for 0, a extensão atual não está na lista até o momento e deve ser adicionada.
A linha de eco basicamente produz, e eu também substituo meus espaços reservados ( :
) por novas linhas para que pareça legal.