Alternativa n. ° 1: FOR / R es más intuitiva que la n. ° 2 para mí.
Alternativa # 2: FOR / F corrige el problema con "espacios en los nombres" en la sugerencia de BrianAdkins.
Alternativa # 3: FORFILES sería mi elección, excepto que la ruta está entre comillas dobles.
Brian u otros gurús pueden tener una solución más elegante o pueden sugerir una docena de otras soluciones, pero estas tres funcionan. Intenté usar FOR TOKENS pero luego tuve que quitar los encabezados y pies de página, así que volví al número 1. También consideré crear un pequeño archivo .bat y llamarlo, pero eso agrega otro archivo (aunque proporciona mayor flexibilidad, como lo haría una función).
Probé todas las alternativas con directorios y nombres de archivos con espacios incrustados, un nombre de archivo de más de 200 caracteres, un nombre de archivo sin extensión y en la raíz de una unidad pequeña (solo por tiempo; un poco lento, como sugirió Brian), pero entonces está buscando en el Explorador de Windows; es por eso que instalé la aplicación de búsqueda Everything).
Alternativa # 1: FOR / R
Mejor (?) Mientras intentaba descubrir por qué la solución de Brian no funcionó para mí, miré HELP FOR y decidí probar el enfoque / R. (Crear un archivo sería lo mismo que en la Alternativa # 2).
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Ejemplo: funciona (directorio diferente al anterior para demostrar la recursividad)
@echo off & for /R "c:\deletelater" %A in (*.*) do echo %~fA %~zA
c:\DeleteLater\Name with Spaces.txt 19800676
c:\DeleteLater\NoSpacesLongName.txt 21745440
c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
Alternativa # 2: FOR / F
BrianAdkins sugirió: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Una respuesta corregida es:
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
Una respuesta más completa con directorios suprimidos y salida (adjunta) a un archivo es:
@echo Results on %DATE% for %CD% >> YourDirFile.txt & echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA >> YourDirFile.txt
Nota: "delims = *" especifica un carácter no permitido en los nombres de archivo.
Nota: el segundo comando también suprime los directorios a través de / a: -d.
Nota: El nombre de la variable FOR está en mayúscula para aclarar la distinción entre los parámetros variables y variables si alguien elige diferentes nombres de variables.
Nota: Se agregó al archivo solo para sonrisas ya que el OP solicitó la salida a un archivo.
Supongo que realmente debería verificar el estado de ECHO y restablecerlo también.
Problema: espacios en los nombres
La solución propuesta de Brian no maneja los nombres de archivos y carpetas que contienen espacios (al menos no en mi configuración de Vista).
Ejemplo: incorrecto
(sin delimitaciones; incluye suprimir directorio por OP pero con tamaño antes y después del nombre de archivo para enfatizar)
Nombre y tamaño truncados (4 de 6 archivos incorrectos):
@echo off & for /f %A in ('dir /s /b /a:-d') do echo %~zA %~fA %~zA
C:\DeleteLater\Name
21745440 C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder
C:\DeleteLater\Folder
C:\DeleteLater\FolderNoSpaces\3rd
28726032 C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
Ejemplo: correcto
(Nota de salida a la pantalla, no adjunta al archivo)
@echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA
C:\DeleteLater\Name with Spaces.txt 19800676
C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
Alternativa # 3: FORFILES (Problema de cotización)
Esta solución es directamente de los últimos dos ejemplos en la documentación FORFILES ( forfiles /?
).
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
La combinación de estos ejemplos y escribir en un archivo produce la respuesta (casi):
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
Tenga en cuenta que la ruta está entre comillas en la salida.
No importa si está activado echo on
o no echo off
.
Agregar una línea en blanco que separa cada directorio sería una extensión trivial del IF.
Precaución : ¡Usar la máscara/m *.*
no devolverá archivos sin extensión (como el último archivo en el ejemplo)!
Aparte : esto escribe un archivo en cada directorio con contenido de ese directorio:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
no es lo que el OP quería pero a veces es útil.
Ejemplo: funciona (pero con la ruta completa entre comillas)
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize"
"c:\DeleteLater\Name with Spaces.txt" 19800676
"c:\DeleteLater\NoSpacesLongName.txt" 21745440
"c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt" 28726032
"c:\DeleteLater\MoreFiles\A really really long file name that goes on and on 123456789 asdfghjkl zxcvnm qwertyuiop and still A really really long file name that goes on and on 123456789 qwertyuiop and still further roughly 225 characters by now.txt" 447
"c:\DeleteLater\MoreFiles\New Text Document no extension" 0
Este ejemplo incluye un directorio adicional con un nombre de archivo súper largo y un nombre de archivo sin extensión.
Problema: Ruta entre comillas
Entonces, ¿hay una manera fácil de eliminar las comillas no deseadas (?) Según el ejemplo de OP y guardar la Alternativa # 3: FORFILES. (Pregunta retórica: ¿Son las citas una característica o un defecto?)
"tokens=*"
mensaje de la siguiente manera@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za