Este 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 .bat
arquivo e execute-o com o comando batchfile
(substitua o nome que desejar) 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 for /f...
linha apenas configura as coisas: faz com que o diretório de destino pesquise, permite expansão atrasada, o que me permite atualizar variáveis no loop e define uma nova linha ( LF
) que eu posso usar para uma saída mais limpa. Ah, e os %~1
meios "obtêm o primeiro argumento, removendo aspas", o que impede citações dobradas - veja for /?
.
O loop usa esse dir /b /s /a:-d "%target%"
comando, pegando uma lista de todos os arquivos em todos os subdiretórios sob o destino.
%%~xi
extrai a extensão dos caminhos completos que o dir
comando retorna.
Uma extensão vazia é substituída por "FileWithNoExtension", para que você saiba que existe esse arquivo - se eu adicionei uma linha vazia, não é tão óbvio.
A lista atual inteira, se enviada por meio de um find
comando, para garantir exclusividade. A saída de texto do comando find é enviada para nul
, essencialmente, um buraco negro - não queremos isso. Como sempre anexamos a :
no final da lista, também devemos garantir que a consulta de pesquisa termine com um :
para que não corresponda a resultados parciais - consulte os comentários.
% ERRORLEVEL% é definido pelo find
comando, um valor 0 indica que houve uma correspondência. Portanto, se não for 0, a extensão atual não está na lista até agora e deve ser adicionada.
A linha de eco basicamente gera e também substituo meus espaços reservados ( :
) por novas linhas para torná-la agradável.