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.
batchfile "path" >filename.txt
aaa.css
yzzz.cs
,.cs
la secuencia de comandos no informará la extensión .:
para forzarla a coincidir con los límites.Aunque no cumpla estrictamente los requisitos para un script por lotes, he usado un script de PowerShell de una sola línea:
Potencialmente podría ejecutarlo desde la línea de comando / archivo por lotes:
No reclamo ningún crédito por ello y, por supuesto, necesitará instalar Powershell. Para las versiones más nuevas de Windows, no hay forma de evitar esto.
Si lo elimina
C:\MyDirectory
, se ejecutará en el directorio actual.Al final producirá un FileExtensions.txt que contiene algo como lo siguiente:
Dependiendo de la estructura de su carpeta, ocasionalmente puede recibir errores que le notifican que tiene una ruta larga.
Cualquier subdirectorio allí tampoco se analizará, pero los resultados de todo lo demás aún se mostrarán.
fuente
Aquí hay una respuesta detallada usando PowerShell (con Windows XP tendrá que instalar PowerShell):
¡Hola, guionista! ¿Cómo puedo usar Windows PowerShell para elegir las extensiones de archivo únicas utilizadas en una colección de archivos?
fuente
Para enumerar todas las extensiones únicas de cmd bajo la ruta que está usando:
fuente
Me pareció útil cambiar
a
y para cambiar
a
El archivo generado contenía (sin saltos de línea, pero no importa) .bat.pdf.skp.ai.png.jpg.tif.pcp.txt.lst.ttf.dfont.psd.indd.docx.PDF.JPG.gif.jpeg .dwg.exr.FileWithNoExtension.vrlmap.sat.bak.ctb
que pude usar para mi proyecto.
fuente