La alternativa #1: FOR /R es más intuitiva que la #2 para mí.
La alternativa #2: FOR /F soluciona el problema de los “espacios en los nombres” de 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 ser capaces de sugerir una docena de otras soluciones, pero estas tres funcionan. Intenté usar FOR TOKENS pero luego tuve que quitar los encabezados y los pies de página así que volví al #1. También consideré crear un pequeño archivo .bat y llamarlo, pero eso añade otro archivo (aunque proporciona mayor flexibilidad, como lo haría una función).
Probé todas las alternativas con nombres de directorios y 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 (sólo por el tiempo; un poco lento – tal como sugirió Brian – pero también lo es la búsqueda en el Explorador de Windows; por eso instalé la aplicación de búsqueda Everything).
Alternativa #1: FOR /R
Mejor(?) Mientras intentaba averiguar por qué la solución de Brian no me funcionaba, miré en 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 Spacesnd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
Alternativa #2: FOR /F
Sugirió BrianAdkins: @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 los directorios suprimidos y la salida (anexada) 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 archivos.
Nota: El segundo comando también suprime los directorios mediante /a:-d.
Nota: Se ha puesto el nombre de la variable FOR en mayúsculas para aclarar la distinción entre la variable y los parámetros de la variable si alguien elige nombres de variables diferentes.
Nota: Añadido al archivo sólo para sonreír, ya que el OP pidió la salida a un archivo.
Supongo que debería comprobar el estado de ECHO y reiniciarlo también.
Issue - Spaces in Names
La solución propuesta por Brian no maneja los nombres de archivos y carpetas que contienen espacios (al menos no en mi configuración de Vista).
Ejemplo - Incorrecto(Sin delims; Incluye la supresión del directorio por OP pero con el tamaño antes y después del nombre del 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\FolderNoSpacesrd
28726032 C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
Ejemplo - Correcto(Observe la salida a pantalla, no se anexa 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 Spacesnd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
Alternativa #3: FORFILES (Problema de cita)
Esta solución es directa de los dos últimos ejemplos en la documentación de FORFILES (forfiles /?
).
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
Combinando estos ejemplos y escribiendo en un fichero se obtiene la respuesta (casi):
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
Observe que la ruta está entre comillas en la salida.
No importa si se activa echo on
o echo off
.
Añadir una línea en blanco separando cada directorio sería una extensión trivial del IF.
Atención_ : ¡El uso de la máscara /m *.*
no devolverá archivos sin extensión (como el último archivo del ejemplo)!
Aside : Esto escribe un archivo en cada directorio con el contenido de sólo 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 el fullpath 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 Spacesnd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.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 extra con un nombre de archivo súper largo y un nombre de archivo sin extensión.
Asunto: Path in Quotes
Así que, ¿hay una manera fácil de eliminar las comillas no deseadas(?) según el ejemplo OP y guardar la alternativa #3: FORFILES. (Pregunta retórica: ¿Las comillas son una característica o un defecto?)