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 .bat
file 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 %~1
mezzo "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.
%%~xi
estrae l'estensione dai percorsi completi dir
restituiti 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 find
comando, 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 find
comando, 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.