Alternativa #1: FOR /R è più intuitiva della #2 per me.
Alternativa #2: FOR /F risolve il problema degli “spazi nei nomi” nel suggerimento di BrianAdkins.
Alternativa #3: FORFILES sarebbe la mia scelta, tranne per il fatto che il percorso è tra doppi apici.
Brian o altri guru potrebbero avere una soluzione più elegante o potrebbero essere in grado di suggerire una dozzina di altre soluzioni ma queste tre funzionano. Ho provato a usare FOR TOKENS ma poi ho dovuto togliere le intestazioni e i piè di pagina quindi sono tornato al #1. Ho anche considerato di creare un piccolo file .bat e chiamarlo ma questo aggiunge un altro file (anche se fornisce una maggiore flessibilità, come una funzione).
Ho testato tutte le alternative con nomi di directory e di file con spazi incorporati, un nome di file di più di 200 caratteri, un nome di file senza estensione, e sulla root di un piccolo disco (solo per il tempo; un po’ lento – proprio come suggerito da Brian – ma lo è anche la ricerca in Windows Explorer; ecco perché ho installato Everything search app).
Alternativa #1: FOR /R
Best(?) Mentre cercavo di capire perché la soluzione di Brian non funzionasse per me ho guardato HELP FOR e ho deciso di provare l'approccio /R. (La creazione di un file sarebbe la stessa dell'alternativa #2. )
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Esempio - Funziona (directory diversa dalla precedente 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 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
suggerito da BrianAdkins: @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 dei file.
Nota: il 2° comando sopprime anche le directory tramite /a:-d.
Nota: reso il nome della variabile FOR maiuscolo per chiarire la distinzione tra parametri variabili e variabili se qualcuno sceglie nomi di variabili diversi.
Nota: Aggiunto al file solo per ridere, dato che l'OP ha chiesto l'output su un file.
Suppongo che dovrei davvero controllare lo stato di ECHO e resettare anche questo.
Issue - Spaces in Names
La soluzione proposta da Brian non gestisce i nomi di file e cartelle contenenti spazi (almeno non nella mia configurazione di Vista).
Esempio - Sbagliato(Senza delimitazioni; Include la soppressione della directory per OP ma con la dimensione sia prima che dopo il nome del file per enfasi)
Nome e dimensione 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\FolderNoSpacesrd
28726032 C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
Esempio - Corretto (Nota output a 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 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 di citazione)
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 su un file si ottiene la risposta (quasi):
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
Nota che il percorso è tra virgolette nell'output.
Non ha importanza se echo on
o echo off
è attivato.
Aggiungere una linea vuota che separa ogni directory sarebbe una banale estensione dell'IF.
Caution : L'utilizzo della maschera /m *.*
non restituirà i file senza estensione (come l'ultimo file nell'esempio)!
Aside : Questo scrive un file in ogni directory con il contenuto di quella sola directory:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
Non è quello che voleva l'OP, ma a volte è utile.
Esempio - Funziona (ma con fullpath 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 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
Questo esempio include una directory extra con un nome file super lungo e un nome file senza estensione.
Percorso: Path in Quotes
Quindi, c'è un modo semplice per rimuovere le indesiderate(?) virgolette secondo l'esempio OP e salvare l'alternativa #3: FORFILES. (Domanda retorica: le virgolette sono una caratteristica o un difetto?)