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 ono 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