Alternative #1: FOR /R ist für mich intuitiver als #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 Anführungszeichen steht.
Brian oder andere Gurus haben vielleicht eine elegantere Lösung oder können ein Dutzend anderer Lösungen vorschlagen, aber diese drei funktionieren. Ich habe versucht, FOR TOKENS zu verwenden, aber dann musste ich Kopf- und Fußzeilen entfernen, also bin ich wieder zu #1 zurückgekehrt. Ich habe auch erwogen, eine kleine .bat-Datei zu erstellen und sie aufzurufen, aber das fügt eine weitere Datei hinzu (obwohl es eine größere Flexibilität bietet, wie 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 im Stammverzeichnis eines kleinen Laufwerks getestet (nur um Zeit zu gewinnen; ein wenig langsam - genau wie Brian vorgeschlagen hat - aber das ist die Suche im Windows Explorer auch; deshalb habe ich die App “Everything search” installiert).
Alternative #1: FOR /R
Best(?) Während ich versuchte, herauszufinden, warum Brians Lösung bei mir nicht funktionierte, schaute ich mir HELP FOR an und entschied mich, den /R-Ansatz zu versuchen. (Das Erstellen einer Datei wäre dasselbe wie in Alternative #2. )
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
Beispiel - funktioniert (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 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
Alternative #2: FOR /F
BrianAdkins’ Vorschlag: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Eine korrigierte Antwort ist:
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
Eine vollständigere Antwort mit unterdrückten Verzeichnissen und Ausgabe (angehängt) in eine Datei ist:
@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 erlaubt ist.
Hinweis: Der 2. Befehl unterdrückt auch Verzeichnisse über /a:-d.
Hinweis: Der FOR-Variablenname wurde in Großbuchstaben geschrieben, um die Unterscheidung zwischen Variablen und Variablenparametern zu verdeutlichen, falls jemand andere Variablennamen wählt.
Hinweis: Nur zum Spaß an die Datei angehängt, da der OP nach einer Ausgabe in eine Datei gefragt hat.
Ich nehme an, ich sollte wirklich den Status von ECHO überprüfen und ihn auch zurücksetzen.
Problem - Leerzeichen in Namen
Brians vorgeschlagene Lösung kommt nicht mit Datei- und Ordnernamen klar, die Leerzeichen enthalten (zumindest nicht in meiner Vista-Konfiguration).
Beispiel - Falsch(Ohne Delims; Inklusive Unterdrückung des Verzeichnisses pro OP, aber mit Größe vor und nach dem Dateinamen zur Hervorhebung)
Abgeschnittener 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\FolderNoSpacesrd
28726032 C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032
Beispiel - Richtig(Hinweis Ausgabe auf Bildschirm, nicht an 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 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
Alternative #3: FORFILES (Zitatausgabe)
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"
Kombiniert man diese Beispiele und schreibt sie in eine Datei, erhält man (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.
Es spielt keine Rolle, ob echo on
oder echo off
umgeschaltet wird.
Das Hinzufügen einer Leerzeile, die jedes Verzeichnis trennt, wäre eine triviale Erweiterung des IF.
Vorsicht : Bei Verwendung der Maske /m *.*
werden keine Dateien ohne Erweiterung zurückgegeben (wie die letzte Datei im Beispiel)!
Aside : Dies schreibt eine Datei in jedes Verzeichnis mit dem Inhalt genau dieses Verzeichnisses:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
Nicht das, was der OP wollte, aber manchmal praktisch.
Beispiel - Funktioniert (aber mit vollem 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 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
Dieses Beispiel enthält ein extra Verzeichnis mit einem superlangen Dateinamen und einen Dateinamen ohne Erweiterung.
Problem: Pfad in Anführungszeichen
Gibt es also eine einfache Möglichkeit, die unerwünschten(?) Anführungszeichen gemäß dem OP-Beispiel zu entfernen und Alternative #3 zu speichern: FORFILES. (Rhetorische Frage: Sind die Anführungszeichen ein Feature oder ein Makel?)