Alternative Nr. 1: FOR / R ist für mich intuitiver als Nr. 2.
Alternative 2: FOR / F behebt das Problem mit "Leerzeichen in Namen" in BrianAdkins Vorschlag.
Alternative 3: FORFILES wäre meine Wahl, außer dass der Pfad in doppelten Anführungszeichen steht.
Brian oder andere Gurus haben vielleicht eine elegantere Lösung oder können vielleicht ein Dutzend anderer Lösungen vorschlagen, aber diese drei funktionieren. Ich habe versucht, FOR TOKENS zu verwenden, musste dann aber Kopf- und Fußzeilen entfernen, sodass ich wieder zu Nummer 1 zurückkehrte. Ich habe auch darüber nachgedacht, eine kleine .bat-Datei zu erstellen und sie aufzurufen, aber dadurch wird eine weitere Datei hinzugefügt (obwohl dies eine größere Flexibilität bietet als eine Funktion).
Ich habe alle Alternativen mit Verzeichnis- und Dateinamen mit eingebetteten Leerzeichen, einem Dateinamen mit mehr als 200 Zeichen, einem Dateinamen ohne Erweiterung und auf dem Stammverzeichnis eines kleinen Laufwerks getestet (nur für kurze Zeit; ein wenig langsam - genau wie Brian es vorgeschlagen hatte - aber dann so sucht im Windows Explorer, deshalb habe ich Everything search installiert.
Alternative 1: FOR / R
Am besten (?) Als ich versuchte herauszufinden, warum Brians Lösung bei mir nicht funktionierte, schaute ich auf HELP FOR und beschloss, den / R-Ansatz zu versuchen. (Das Erstellen einer Datei entspricht Alternative 2.)
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Beispiel - Works (anderes Verzeichnis als oben, um die Rekursion zu demonstrieren)
@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
Alternative 2: FOR / F
BrianAdkins schlug vor: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Eine korrigierte Antwort lautet:
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
Eine vollständigere Antwort, bei der Verzeichnisse unterdrückt und an eine Datei angehängt werden, lautet:
@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
Hinweis: "delims = *" gibt ein Zeichen an, das in Dateinamen nicht zulässig ist.
Hinweis: Der zweite Befehl unterdrückt auch Verzeichnisse über / a: -d.
Anmerkung: Der FOR-Variablenname wurde in Großbuchstaben geschrieben, um die Unterscheidung zwischen Variablen- und Variablenparametern zu verdeutlichen, wenn jemand andere Variablennamen auswählt.
Hinweis: Wird nur zum Grinsen an die Datei angehängt, da das OP die Ausgabe in eine Datei anfordert.
Ich nehme an, ich sollte den Status von ECHO wirklich überprüfen und auch zurücksetzen.
Problem - Leerzeichen in Namen
Brians vorgeschlagene Lösung behandelt keine Datei- und Ordnernamen, die Leerzeichen enthalten (zumindest nicht in meiner Vista-Konfiguration).
Beispiel - Falsch
(Ohne Trennzeichen; Beinhaltet das Unterdrücken des Verzeichnisses pro OP, jedoch mit der Größe vor und nach dem Dateinamen zur Hervorhebung)
Verkürzter Name und Größe (4 von 6 Dateien falsch):
@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
Beispiel - Korrigieren
(Ausgabe auf dem Bildschirm notieren, nicht an die Datei angehängt)
@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
Alternative 3: FORFILES ( Angebotsausgabe )
Diese Lösung stammt direkt aus den letzten beiden Beispielen in der FORFILES-Dokumentation ( forfiles /?
).
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
Wenn Sie diese Beispiele kombinieren und in eine Datei schreiben, erhalten Sie (fast) die Antwort:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
Beachten Sie, dass der Pfad in der Ausgabe in Anführungszeichen steht.
Egal ob umgeschaltet echo on
oder echo off
.
Das Hinzufügen einer Leerzeile, die jedes Verzeichnis trennt, wäre eine triviale Erweiterung der IF.
Achtung : Bei Verwendung der Maske/m *.*
werden keine Dateien ohne Erweiterung zurückgegeben (wie die letzte Datei im Beispiel)!
Nebenbei : Dies schreibt eine Datei in jedes Verzeichnis mit dem Inhalt nur dieses Verzeichnisses:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
Nicht das, was das OP wollte, aber manchmal praktisch.
Beispiel - Funktioniert (jedoch mit vollständigem Pfad in Anführungszeichen)
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
Dieses Beispiel enthält ein zusätzliches Verzeichnis mit einem sehr langen Dateinamen und einem Dateinamen ohne Erweiterung.
Problem: Pfad in Anführungszeichen
Gibt es eine einfache Möglichkeit, die unerwünschten (?) Anführungszeichen gemäß dem OP-Beispiel zu entfernen und Alternative 3: FORFILES zu speichern? (Rhetorische Frage: Sind die Zitate ein Merkmal oder ein Fehler?)
"tokens=*"
Folgendes hinzu@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za