Ruft rekursiv leere Dateinamen in der Eingabeaufforderung ab


19

Ich bin auf einen kleinen Haken gestoßen, als ich versucht habe, nur die Dateinamen (keine Erweiterungen oder Dateipfade) rekursiv abzurufen. Das funktionierte für mich im Stammordner:

dir /b

Aber als ich / s zum rekursiven Scannen hinzufügte, bekam ich auch Dateipfade vor Dateinamen, die ich nicht möchte. Gibt es eine Möglichkeit, leere Dateinamen aus allen Unterordnern in einem Verzeichnis abzurufen?

Im auf Windows 7 x64 Ich würde eher normale Eingabeaufforderung nicht PS oder VBS verwenden

Antworten:


15

Verwenden Sie den folgenden Befehl:

dir /b /a /s
  • / b entfernt das Datum und andere Details aus der Ausgabe
  • / a gibt nur den Dateinamen aus, keine Pfade
  • / s aktiviert eine rekursive Verzeichnisliste

Wenn Sie die Ausgabe in einer Datei speichern müssen, können Sie Folgendes verwenden:

dir /b /a /s >> list_of_names.txt

BEARBEITEN Tatsächlich erreicht die obige Lösung nicht die Ziele der ursprünglichen Frage. Eine Sache, die mir bei der Frage aufgefallen ist, ist, dass der Beitrag nach einer rekursiven Auflistung fragt. was der anderen Antwort fehlt, so denke ich, dass das Hinzufügen von "/ s" in der Antwort des anderen Antwortenden den Trick tun wird

for /f %a in ('dir /b /s') do @echo %~na

Können Sie das erklären? Für mich macht es wenig Sinn.
Simon Sheehan

4
Dies funktioniert nicht, / a funktioniert nicht so - es ist ein Filter für welchen Dateityp Sie auflisten möchten. Bei einer rekursiven Verzeichnisliste wird der Pfad nicht aus dem Dateinamen entfernt.
Gaff

bearbeitete die Antwort; und habe gerade wieder eine Windows-Box in den Händen, ich denke, diesmal sollte es tun (win732bit)
Nik So

6

Versuche dies:

for /f "delims=" %a in ('dir /b /s') do @echo %~na

Weitere Informationen darüber, wie und wo es funktioniert, geben Sie ein for /?


Das funktioniert fast, aber es gibt ein großes Problem. Es wird nur das erste Wort eines Dateinamens
ausgegeben. Wenn

versuche dies: für / f "delims = |" % a in ('dir / b') macht @echo% ~ na. Standardmäßig wird der Parameter / f von FOR für Leerzeichen als Token verwendet. Wenn Sie das Token auf ein Zeichen setzen, das nicht in Datei- / Verzeichnisnamen enthalten sein soll, erhalten Sie den gesamten Namen einschließlich Leerzeichen.
Scott McKinney

Wenn Sie die Ausgabe in eine Datei senden möchten, fügen Sie>> filename.txt
Gruber

2
for /r %i in (*) do @echo %~ni

oder

forfiles /s /c "cmd /c if @isdir==FALSE noquotes.bat @fname"

Nehmen wir eine Datei noquotes.batin Ihrem % PATH% mit diesem Inhalt an

@echo %~1

für / r Ansatz erklärt

for /rDurchläuft das aktuelle Verzeichnis rekursiv (Sie können ein Verzeichnis angeben for /r drive:\path\, das aktuelle Verzeichnis wird angenommen) und führt den Befehl aus, der von do für jede in der Gruppe übereinstimmende Datei angegeben wurde (*). Der Satz (.)würde nur mit Verzeichnissen übereinstimmen. @echo% ~ ni Dieser Befehl funktioniert unverändert an der Eingabeaufforderung. Verdoppeln Sie Ihre Anführungszeichen, wenn Sie sie in eine Batch-Datei einfügen. dhfor /r %%i in (*) do @echo %%~ni

forfiles Ansatz erklärt

/sListet das aktuelle und alle Unterverzeichnisse auf,
/cführt den Befehl innerhalb der Anführungszeichen aus
@isdirund @fnameist ein Symbol, das in die Befehlszeichenfolge ausgegeben wird.
Die zusätzliche Batch-Datei noquotes.bathilft, indem Sie die doppelten Anführungszeichen mit% ~ 1 (Parameter 1)
forfilesentfernen. Außerdem können Sie einen Pfad angeben, bei dem begonnen werden sollforfiles /P C:\Windows ...


@ DavidPostill ja, es war eine schlechte Antwort. Danke für deine Kommentare. Bitte lassen Sie mich wissen, ob ich meine Antwort weiter verbessern kann.
JJS

@ DavidPostill Sie haben keine vorherige Antwort oder Kommentar. Haben Sie Fragen moderiert oder nach einer Antwort gesucht und sind über meine schlechte Antwort gestolpert?
JJS

Ihre Antwort tauchte in der Überprüfungswarteschlange "Beiträge von geringer Qualität" auf. Da ich viel über Batch-Dateien weiß, habe ich es mir genauer angesehen.
DavidPostill

@ DavidPostill vielen Dank für Ihre Bewertung. Ich begrüße Ihre Überprüfung der Änderungen, die ich an meiner Antwort vorgenommen habe.
JJS

Viel besser ... :)
DavidPostill

-1

Listen Sie alle Dateien rekursiv mit Attributen (nicht mit dem Verzeichnis) auf (nur Dateien).

dir / B / S / A: -D

C: \ test \ cache> dir / B / S / A: -D

C: \ test \ cache \ 7 \ 0f \ 7b50ed0522645513da90345120eaf0f7 C: \ test \ cache \ d \ 23 \ 814644aa6a8195c91e54d2f7bb64e23d


Die Frage besagt, dass das OP „versucht, nur die Dateinamen abzurufen (keine Erweiterungen oder Dateipfade). … Aber als ich [versucht dir /b /s] habe, rekursiv zu scannen, habe ich auch Dateipfade vor den Dateinamen, die ich nicht möchte. “Sie fordern das OP auf, eine unbedeutende Variante dessen auszuprobieren, was sie bereits ausprobiert haben, und Ihre Antwort zeigt dies dass es das gleiche Ergebnis liefert, als das OP es versucht hat (dh nicht, was sie wollen).
Scott
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.