Questo script batch lo farà.
@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
Salvalo come qualsiasi .batfile ed eseguilo con il comando batchfile(sostituisci il nome che hai assegnato) per elencare la directory corrente o specifica un percorso con batchfile "path". Cercherà tutte le sottodirectory.
Se si desidera esportare in un file, utilizzare batchfile >filename.txt(o batchfile "path" >filename.txt).
Spiegazione
Tutto ciò che precede la for /f...riga imposta semplicemente le cose: ottiene la directory di destinazione da cercare, abilita l'espansione ritardata che mi consente di aggiornare le variabili nel ciclo e definisce una newline ( LF) che posso usare per un output più ordinato. Oh, e il %~1mezzo "ottieni il primo argomento, rimuovendo le virgolette" che impedisce le virgolette doppie - vedi for /?.
Il ciclo usa quel dir /b /s /a:-d "%target%"comando, afferrando un elenco di tutti i file in tutte le sottodirectory sotto la destinazione.
%%~xiestrae l'estensione dai percorsi completi dirrestituiti dal comando.
Un'estensione vuota viene sostituita con "FileWithNoExtension", quindi sai che esiste un file del genere: se invece aggiungessi una riga vuota, non sarebbe altrettanto ovvio.
L'intero elenco corrente, se inviato tramite un findcomando, per garantire unicità. L'output di testo del comando find viene inviato a nul, essenzialmente un buco nero - non lo vogliamo. Poiché aggiungiamo sempre :a alla fine dell'elenco, dovremmo anche assicurarci che la query di ricerca termini con un in :modo che non corrisponda ai risultati parziali - vedi commenti.
% ERRORLEVEL% è impostato dal findcomando, un valore di 0 indica che c'è stata una corrispondenza. Quindi, se non è 0, l'estensione corrente non è ancora nell'elenco e dovrebbe essere aggiunta.
La linea di eco in pratica emette e sostituisco anche i miei segnaposto ( :) con le nuove righe per renderlo piacevole.