Ich versuche, eine Textdatei zu generieren, die den Dateinamen (einschließlich des vollständigen Pfads) und die Dateigröße für alle Dateien in einem bestimmten Verzeichnis und in einem seiner Unterverzeichnisse (dh rekursiv) enthält. Im Idealfall möchte ich keine Kommas in der Dateigröße (aber ich werde mich damit zufrieden geben!)
Der folgende Befehl tut es aber ohne die Dateigröße:
dir /b /s /a:-D > results.txt
Eine Beispielausgabe würde folgendermaßen aussehen:
C:\Users\Martin\Pictures\Table\original\PC120013.JPG 227298
C:\Users\Martin\Pictures\Table\original\PC120014.JPG 123234
C:\Users\Martin\Pictures\Table\original\PC120015.JPG 932344
Ich denke nicht, dass dies dir
alleine möglich ist , obwohl ich es lieben würde, wenn ich mich als falsch erweisen würde. Gibt es eine andere Möglichkeit, dies zu tun, indem nur Befehle verwendet werden, die über die Eingabeaufforderung verfügbar sind?
quelle
"tokens=*"
Folgendes hinzu@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za
txt
Datei?for /r %a in (*) do echo %~fa %~za
>> C:\Temp\VideoList.txt
- Die Ergebnisse aller zuvor durchgeführten Prozesse werden in eine Textdatei mit dem Namen VideoList geschrieben . Mit one > wird die Datei überschrieben ( falls bereits vorhanden ) und mit >> werden neue Ergebnisse an das Ende angehängt, falls die Textdatei bereits vorhanden ist . Wenn die Textdatei noch nicht vorhanden ist, schreibt dieser Befehl eine neue Datei mit dem angegebenen Namen.@echo off & for /f "tokens=*" %a in ('dir *.dwg /s /b') do echo %~fa >>dwgfiles.txt
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.)
Beispiel - Works (anderes Verzeichnis als oben, um die Rekursion zu demonstrieren)
Alternative 2: FOR / F
BrianAdkins schlug vor:
@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Eine korrigierte Antwort lautet:
Eine vollständigere Antwort, bei der Verzeichnisse unterdrückt und an eine Datei angehängt werden, lautet:
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):
Beispiel - Korrigieren (Ausgabe auf dem Bildschirm notieren, nicht an die Datei angehängt)
Alternative 3: FORFILES ( Angebotsausgabe )
Diese Lösung stammt direkt aus den letzten beiden Beispielen in der FORFILES-Dokumentation (
forfiles /?
).Wenn Sie diese Beispiele kombinieren und in eine Datei schreiben, erhalten Sie (fast) die Antwort:
Beachten Sie, dass der Pfad in der Ausgabe in Anführungszeichen steht.
Egal ob umgeschaltet
echo on
oderecho 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)
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?)
quelle
Ich weiß , dass dies ein zusätzliches Dienstprogramm erfordert , aber Sie können dies mit dem Dienstprogramm sfk ziemlich genau erreichen :
(Ich habe den Ansatz mit sfk Befehl Verkettung hier )
quelle
Dies kann ein Betrug in der Frage des OP sein. Auf modernen Windows-basierten Systemen ist die Frage jedoch nicht mehr relevant. Der Dir-Alias wurde zum Zeichnen der logischen Verknüpfung verwendet.
quelle
powershell "Get-ChildItem -Recurse| select name,length"
Im Folgenden habe ich nach Videodateien gesucht, die auf einem Netzwerklaufwerk zu viel Platz beanspruchten, und die Ergebnisse in eine Textdatei auf einem lokalen PC geschrieben.
Ich poste meine eigene, etwas verspätete Antwort aus drei Gründen. Erstens mag ich prägnante Antworten. Zweitens funktionierte diese einzige Skriptzeile in mehreren Einstellungen, auch in einem Netzwerk. Drei, laut Don Vinces möglicherweise undurchsichtigem Kommentar unter BrianAdkins 'Antwort, können durch die Verwendung von Tokens Probleme durch Dateinamen mit Leerzeichen umgangen werden.
for /f "tokens=*" %%a in ('dir H:\*.mov H:\*.avi H:\*.wmv H:\*.mp4 /s /b') do echo %%~fa %%~za >> C:\Temp\VideoList.txt
Mir ist aufgefallen, dass sehr lange Dateipfade / Dateinamen (Hunderte von Zeichen) ebenfalls Fehler verursachen können, aber die Suche bleibt bei diesen nicht hängen. Der Pfad ist jedoch für Ihre Ziele noch nicht vollständig erforscht. Einmal notiert, können Sie dies kompensieren, indem Sie tiefer in die Ordnerstruktur einsteigen, um diesen Fehler zu beseitigen.
Diese Seite ss64 bietet eine sehr gute Darstellung der Verwendung des Befehls dir , listet alle Schalter und viele Schalterkombinationen auf und zeigt einige nützliche Beispiele für die richtige Syntax. Es ist nicht so umfassend wie die verschiedenen Stack Exchange-Communitys, aber es gibt eine eindeutige Klarheit in der Präsentation, sobald Sie sich mit Befehlszeilen- / Batch-Skripten vertraut gemacht haben.
quelle
Ich habe dies mit folgendem Befehl erreicht:
Das Ergebnis:
PS Dies basiert auf der Antwort von BillR (Alternative # 1). Allerdings hängt es bei mir mit
@echo off
.quelle
Ich finde den "du" -Befehl ziemlich hilfreich und er funktioniert sowohl unter Windows als auch unter Unix (dient dazu zu überprüfen, ob alle Dateien beim Übertragen vieler Daten von einem Windows-PC auf einen Linux-Webserver kopiert wurden):
Ausgänge:
Allerdings konnte ich nur die Sonderzeichen in Notepad richtig sehen, nicht in Notepad ++ (muss eine ANSI / UTF-8-Codierungssache sein, keine Zeit, um genau zu analysieren). Außerdem habe ich keine Lösung gefunden, um die Größe nach dem Dateinamen anzuzeigen. Verwenden Sie die Optionen "b" oder "k" anstelle von "h", um die Größe in Byte oder Kilobyte anzuzeigen. Ich hatte Probleme beim Ausführen des Befehls außerhalb des Ordners, den ich analysieren möchte. Geben Sie den Befehl am besten im richtigen Verzeichnis ein (in diesem Beispiel "C: \ your_dir") und geben Sie ihn im Befehl an.
quelle
Lassen Sie das b in dir / b / s / a: -D> results.txt weg und die Ergebnisse sollten so aussehen (dh dir / s / a: -D> results.txt):
quelle
Ohne allzu kompliziert zu werden, sollte dies die gewünschte Ausgabe ergeben. Es wird ein bisschen mehr geben, als das OP verlangt, aber ich dachte, es wäre erwähnenswert. Fügen Sie die Option / R hinzu, um ein anderes als das aktuelle Verzeichnis anzugeben.
quelle
ERROR: Invalid syntax. Value expected for '/r'
Gehen Sie zurück zum Zeichenbrett und geben Sie die richtige Syntax an und bearbeiten Sie Ihre Antwort mit den richtigen Details.where /?
sagt: „Standardmäßig wird die Suche entlang des aktuellen Verzeichnisses und in den von der Umgebungsvariablen PATH angegebenen Pfaden durchgeführt . ”- sowhere * /t
listet Ihr Befehl jede Datei inC:\Windows\System32
, einige Unterverzeichnisse vonC:\Program Files
und jedes andere Verzeichnis in aufPATH
. Für mich waren das über 3000 Zeilen. Bitte überlegen Sie, Ihre Antwort zu bearbeiten, um sie angemessen zu gestalten. PS Ohne/R
ist es nicht rekursiv.