Alternativa # 1: FOR / R è più intuitiva di # 2 per me.
Alternativa n. 2: FOR / F risolve il problema con "spazi nei nomi" nel suggerimento di BrianAdkins.
Alternativa n. 3: FORFILES sarebbe la mia scelta, tranne per il fatto che il percorso è tra virgolette doppie.
Brian o altri guru potrebbero avere una soluzione più elegante o essere in grado di suggerire una dozzina di altre soluzioni, ma questi tre funzionano. Ho provato a usare FOR TOKENS ma poi ho dovuto rimuovere le intestazioni e i piè di pagina, quindi sono tornato al numero 1. Ho anche pensato di creare un piccolo file .bat e chiamarlo, ma che aggiunge un altro file (anche se fornisce una maggiore flessibilità, come farebbe una funzione).
Ho testato tutte le alternative con directory e nomi di file con spazi incorporati, un nome di file di oltre 200 caratteri, un nome di file senza estensione e su root di una piccola unità (solo per tempo; un po 'lento - proprio come Brian ha suggerito - ma poi così sta effettuando la ricerca in Esplora risorse, ecco perché ho installato l'app di ricerca Tutto).
Alternativa n. 1: FOR / R
Il migliore (?) Nel tentativo di capire perché la soluzione di Brian non ha funzionato per me, ho cercato HELP FOR e ho deciso di provare l'approccio / R. (La creazione di un file sarebbe la stessa dell'alternativa n. 2).
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Esempio: funziona (directory diversa da quella sopra per dimostrare la ricorsione)
@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 n. 2: FOR / F
BrianAdkins 'suggerito: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Una risposta corretta è:
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
Una risposta più completa con le directory soppresse e l'output (aggiunto) a un file è:
@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 = *" specifica un carattere non consentito nei nomi di file.
Nota: il secondo comando elimina anche le directory tramite / a: -d.
Nota: rendere il nome della variabile FOR in maiuscolo per chiarire la distinzione tra parametri variabili e parametri variabili se qualcuno sceglie nomi variabili diversi.
Nota: aggiunto al file solo per i sorrisi quando l'OP ha richiesto l'output in un file.
Suppongo che dovrei davvero controllare lo stato di ECHO e ripristinarlo pure.
Problema - Spazi nei nomi
La soluzione proposta da Brian non gestisce i nomi di file e cartelle contenenti spazi (almeno non nella mia configurazione di Vista).
Esempio: errato
(senza delim; include la soppressione della directory per OP ma con dimensioni sia prima che dopo il nome del file per enfasi)
Nome e dimensioni troncati (4 di 6 file errati):
@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
Esempio - Corretto
(nota l'output sullo schermo, non aggiunto al file)
@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 n. 3: FORFILES (numero di preventivo)
Questa soluzione è direttamente dagli ultimi due esempi nella documentazione FORFILES ( forfiles /?
).
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
Combinando questi esempi e scrivendo in un file si ottiene la risposta (quasi):
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
Si noti che il percorso è tra virgolette nell'output.
Non importa se è attivato echo on
o echo off
disattivato.
L'aggiunta di una riga vuota che separa ciascuna directory sarebbe un'estensione banale dell'IF.
Attenzione : l'uso della maschera/m *.*
non restituirà i file senza estensione (come l'ultimo file nell'esempio)!
A parte : questo scrive un file in ogni directory con il contenuto di quella directory:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
non quello che l'OP voleva ma a volte utile.
Esempio: funziona (ma con il percorso completo tra virgolette)
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
Questo esempio include una directory aggiuntiva con un nome file molto lungo e un nome file senza estensione.
Problema: percorso tra virgolette
Quindi, c'è un modo semplice per rimuovere le virgolette indesiderate (?) Per l'esempio OP e salvare l'alternativa n. 3: FORFILES. (Domanda retorica: le virgolette sono una caratteristica o un difetto?)
"tokens=*"
come segue@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za