Batch Windows-Dateiensuche möglich?

Marvolo

Lt. Commander
Registriert
Nov. 2007
Beiträge
1.880
Hallo,

ich habe eine TXT-Datei. Diese enthält aufgelistet nach Dateispeicherpfad zahlreiche Dateien.
Ich habe angefangen, händisch nach diesen Dateien auf meinem Computer zu suchen, aber da würde ich ewig dran hocken.

Weiß jemand eine schnelle Möglichkeit, wie ein Script aussehen müsste, das automatisiert nach allen in dieser Text-Datei aufgelisteten Dateien sucht und FALLS sie auf dem Computer gefunden werden, dass es die betreffenden Dateien dann in einen Zielordner reinkopiert?

Gesucht werden soll logischerweise nicht der gesamte in der TXT-Datei abgebildete Pfad, sondern lediglich der Dateiname (beginnend nach dem allerletzten / im Dateipfad).

Also irgendwie sowas wie:

"Schau in output.txt und suche nach den dort aufgelisteten Dateinamen auf dem PC im Verzeichnis XYZ und FALLS sie dort gefunden werden, kopiere diese in den Zielorder Desktop\Gefunden\"

1718547073435.png
 
Auch rekursiv in Unterordnern oder nur direkt in bestimmten Ordnern?
Im Grunde ist die Überprüfung, ob die Datei existiert unnötig, weil copy halt einfach nichts kopiert, wenn die Quelldatei nicht gefunden ist.

In Batch nicht rekursiv:
Code:
for /f %%i in (liste.txt) do (
copy Suchverzeichnis\%%~nxi Zielverzeichnis
)
 
  • Gefällt mir
Reaktionen: Marvolo
simpsonsfan schrieb:
Auch rekursiv in Unterordnern oder nur direkt in bestimmten Ordnern?

Wenn du so fragst, wäre eine Suche im gesamten Laufwerk (sprich mit allen Unterordnern) sogar besser.
Wie müsste das Script dann aussehen?

Und wie funktioniert das mit dem Zielverzeichnis? Also die Liste.txt würde ich auf dem Desktop liegen haben (als Verzeichnisangabe für das Script). Das Suchverzeichnis ist das Netzwerklaufwerk W:\
Das Zielverzeichnis, wo die gefundenen Dateien (falls es überhaupt welche findet) reinkopiert werden sollen, ebenfalls Desktop\gefunden\.

So dann?
Code:
for /f %%i in (output.txt) do (
copy W:\\%%~nxi C:\Users\name\Desktop\gefunden
)
 
Zuletzt bearbeitet:
Mit rekursivem Durchsuchen der Unterverzeichnisse wird es ein klein wenig komplizierter. Würde dann, wenn es weiterhin .bat sein soll, die Auflistung von Dateien mit dir /B /S Suchverzeichnis versuchen.

Bei deinem Ausschnitt sollte glaube ich W:\%%~nxi stehen, also nur ein Backslash, weil das Netzlaufwerk ja einen Laufwerksbuchstaben hat. Zwei könnten aber auch klappen.

Bin leider nicht unbedingt stark bewandert in Batch, aber mit einer doppelten for-Schleife (für jede Datei (rekursiv mit Unterordnern) im Suchverzeichnis schauen, ob sie in der Dateiliste auftaucht und falls ja, kopieren.
ChatGPT/Copilot kann da evtl. auch helfen, also einfach mal bei Bing fragen.
 
  • Gefällt mir
Reaktionen: s1ave77
Code:
@echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
pushd "%~dp0"
cd "%~dp0"
set "folderpath=m:\test"
for /f %%i in (output.txt) do (
    for /r "%folderpath%" %%A in (*.*) do (
        if "%%~nxA"=="%%~nxi" copy "%%A" "C:\Users\name\Desktop\gefunden"
))
pause

%folderpath% ist der zu durchsuchende Ordner (oberste Ebene).

Batch geht davon aus, die output.txt liegt im selben Verzeichnis.

Der äußere Loop holt den Dateinamen und der innere for /r Loop iteriert recursiv durch die Unterordner und kopiert gefundene 'Matches'.

EDIT: Desktop als Ordner ist immer so eine Sache :). Besser ein dedizierter Ordner für beide Dateien, dann läuft das besser.
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Marvolo
Das Ganze sieht für das Netzwerklaufwerk w:\ also so aus und es durchsucht dann auch alle Unterordner von W:\ ?
Und vom TXT-Dokument nimmt es jeweils auch nur den hinteren Dateinamen, nicht den gesamten Pfad?

Code:
@echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
pushd "%~dp0"
cd "%~dp0"
set "folderpath=m:\test"
for /f %%i in (output.txt) do (
    for /r "W:\" %%A in (*.*) do (
        if "%%~nxA"=="%%~nxi" copy "%%A" "C:\Users\name\Desktop\gefunden"
))
pause
 
  • Gefällt mir
Reaktionen: s1ave77
Wäre dann:
Code:
set "folderpath=w:"

Ist als Wert ein kompletter Pfad aus der TXT, daher ja, ist nur der Name+Endung. Beim Kopieren dann %%A für den vollen Pfad.
Ergänzung ()

Übrigens: beim Testen solcher Sachen einfach erstmal ein echo %%A laufen lassen anstelle des Copy, dann sieht man welche Dateipfade gefunden werden. Habe so eine Test-CMD + TXT gebaut und geprüft, ob das Sinn ergibt :).
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Marvolo
Vielen Dank euch zweien!

Das Batch-Script läuft bzw. sucht gerade. Da es über Netzwerk geht und zudem alle Unterordner durchsucht, dauert das ziemlich. Das war aber auch bei manueller Suche nach einem einzelnen Dateinamen schon so und die TXT-Datei enthält hier ja sehr viele Namen.

Bin mal gespannt, ob es was findet.

PS: Also bisher bleibt der "gefunden"-Ordner leer. Kann natürlich sein, dass es die jeweiligen Daten im Zielverzeichnis nicht findet, oder muss man davon ausgehen, dass das Script vielleicht etwas nicht korrekt sucht? Auch kann ich anhand der CMD-Zeile, wo der Cursor einfach nur weiter blinkt, nicht abschätzen, ob die Suche jetzt schon (erfolglos) beendet wurde, oder ob noch gesucht wird.

Ich warte einfach noch ein wenig.
 
Problem sind die Leerzeichen im Pfad bei dir, daran hatte ich nicht gedacht :).
 
Weiß nicht genau, was du meinst, aber das gerade laufende Batch-Script sieht so aus:

Code:
@echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
pushd "%~dp0"
cd "%~dp0"
set "folderpath=w:"
for /f %%i in (output.txt) do (
    for /r "w:\" %%A in (*.*) do (
        if "%%~nxA"=="%%~nxi" copy "%%A" "C:\Users\name\Desktop\gefunden"
))
pause

Und ich höre auch anhand des Festplatten-Ratterns des Netzwerkcomputers, dass da was durchsucht wird.

PS: Achso, du beziehst dich auf die output.txt Datei und die dort enthaltenen Leerzeichen bei "WhatsApp Images"?

Die sind allerdings nicht überall in der txt-Datei enthalten, manchmal gibt's auch keine Leerzeichen im Pfad - insbesondere bzw. einzig alleine NUR beim Status-Verzeichnis:

1718553196201.png
 
Er sucht nach dem Falschen, da die Leerzeichen im Pfad der output.txt stören, ohne funktioniert es. Eine der Macken bei Batch.
 
mae1cum77 schrieb:
Er sucht nach dem Falschen, da die Leerzeichen im Pfad der output.txt stören, ohne funktioniert es.

Verstehe. Das heißt, ich muss die Leerzeichen in der TXT-Datei alle entfernen? Händisch mit ENTF oder Backspace, dann neu abspeichern?
 
  • Gefällt mir
Reaktionen: s1ave77
Marvolo schrieb:
Händisch mit ENTF oder Backspace, dann neu abspeichern?
Suchen und Ersetzen von Leerzeichen mit keinem Zeichen sollte schneller gehen :).

Grad mal etwas geschaut, finde aber auf die Schnelle keine Lösung, die zu ignorieren.
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Marvolo
Könnte ein "... delims=" (also nichts als Token-Trenner in der for-Schleife) helfen?

Also
Code:
@echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
pushd "%~dp0"
cd "%~dp0"
for /f "delims=" %%i in (output.txt) do (
    for /r "W:\" %%A in (*.*) do (
        if "%%~nxA"=="%%~nxi" copy "%%A" "C:\Users\name\Desktop\gefunden"
))
pause

Edit: Btw, abhängig von der erwarteten Anzahl an Dateien/Treffern würde ich die Schleifen aber umdrehen, also einmal die Platte / den Ordner "W:\" nach Dateien ablaufen und dafür jedesmal die Liste (die ja dann im RAM liegen dürfte) je Datei durchgehen. Ob das wirklich schneller ist, bleibt zu testen.
 
  • Gefällt mir
Reaktionen: Marvolo und s1ave77
Habe die Leerzeichen entfernt. Lasse es jetzt nochmal neu laufen, mal schauen, was passiert.
 
  • Gefällt mir
Reaktionen: s1ave77
simpsonsfan schrieb:
Könnte ein "... delims="
Verdammt, manchmal ist es so einfach, an die hatte ich nicht gedacht - das ist es tatsächlich! :D
Ergänzung ()

@Marvolo die Ergänzung von @simpsonsfan ist die Lösung. Hatte vergessen, dass man die tatsächlich so einfach ausschließen kann.

Für weitere Listen dann...
 
  • Gefällt mir
Reaktionen: simpsonsfan
Vielleicht sollte ich das Suchgebiet doch etwas eingrenzen. Wenn ich das Ganze nun doch eher nur auf einen bestimmten Ordner (samt Unterordnern) beschränken will, welche Änderungen am Script muss ich dann vornehmen?

Also Suche nur in

w:\Ordner\ (samit Unterordner darin)

Reicht es aus, dann den Pfad im Script auf "w:\Ordner\" zu stellen? Mehr nicht?

Also so:

@Echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
pushd "%~dp0"
cd "%~dp0"
set "folderpath=w:\Ordner"
for /f %%i in (output.txt) do (
for /r "w:\Ordner\" %%A in (.) do (
if "%%~nxA"=="%%~nxi" copy "%%A" "C:\Users\name\Desktop\gefunden"
))
pause
 
Marvolo schrieb:
Reicht es aus, dann den Pfad im Script auf "w:\Ordner\" zu stellen? Mehr nicht?
Genau. Das definiert die oberste Ebene, davon abwärts wird gesucht.

Das kann je nach Liste und Dateiaufkommen sonst einiges an IO verursachen - ist halt 'Brute Force' :).
 
Gut, dann wird jetzt erstmal nur im Backup-Ordner (& Unterordnern) gesucht.

Code:
@echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
pushd "%~dp0"
cd "%~dp0"
set "folderpath=w:\backup"
for /f %%i in (output.txt) do (
    for /r "w:\backup" %%A in (*.*) do (
        if "%%~nxA"=="%%~nxi" copy "%%A" "C:\Users\name\Desktop\gefunden"
))
pause
Ergänzung ()

Jetzt bliebe nur die Frage, woran ich erkenne, dass die Suche beendet ist? In der CMD-Konsole blinkt der Cursor in der nächsten Zeile nach dem Suche.bat-Befehl nur fröhlich vor sich hin.

Die Festplatte des Netzwerkcomputers scheint aber noch etwas zu rattern.
 

Ähnliche Themen

Zurück
Oben