Este script por lotes lo hará.
@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
Guárdelo como cualquier .bat
archivo y ejecútelo con el comando batchfile
(sustituya el nombre que haya nombrado) para enumerar el directorio actual o especifique una ruta con batchfile "path"
. Buscará todos los subdirectorios.
Si desea exportar a un archivo, use batchfile >filename.txt
(o batchfile "path" >filename.txt
).
Explicación
Todo antes de la for /f...
línea simplemente configura las cosas: hace que el directorio de destino busque, habilita la expansión retardada, lo que me permite actualizar las variables en el bucle y define una nueva línea ( LF
) que puedo usar para una salida más ordenada. Ah, y los %~1
medios "obtienen el primer argumento, eliminando comillas" que evitan las comillas duplicadas, ver for /?
.
El bucle usa ese dir /b /s /a:-d "%target%"
comando, capturando una lista de todos los archivos en todos los subdirectorios bajo el objetivo.
%%~xi
extrae la extensión de las rutas completas que dir
devuelve el comando.
Una extensión vacía se reemplaza con "FileWithNoExtension", para que sepa que existe dicho archivo; si agregué una línea vacía, no es tan obvio.
La lista actual completa si se envía a través de un find
comando, para garantizar la unicidad. La salida de texto del comando find se envía nul
, esencialmente a un agujero negro, no lo queremos. Como siempre agregamos un :
al final de la lista, también debemos asegurarnos de que la consulta de búsqueda finalice con un :
para que no coincida con los resultados parciales; vea los comentarios.
El find
comando establece% ERRORLEVEL% , un valor de 0 indica que hubo una coincidencia. Entonces, si no es 0, la extensión actual no está en la lista hasta el momento y debe agregarse.
La línea de eco básicamente sale, y también reemplazo mis marcadores de posición ( :
) con nuevas líneas para que se vea bien.