Dateisuche per Batch anhand einer Liste
Hallo zusammen,
nachdem ich schon einige Foren durch habe und am Verzweifeln bin, muss ich doch mal direkt nachfragen und um Hilfe bitten.
Auch ich möchte div. Dateien anhand einer Liste (txt, o.ä.) suchen (Hauptverzeichnis inkl. Unterverzeichnisse) und die gefundenen Dateien in ein bestimmtes Zielverzeichnis kopieren. Klasse, wäre noch, wenn eine Art Log erstellt werden würde von den Dateien, die nicht gefunden wurden aber das ist optional. Bin ja schon froh, wenn ich knapp 700 Dateien nicht von Hand suchen muss.
Ich arbeite an einem Windows-Rechner (Windows 7) und habe folgendes Script in einer Batch-Datei verwendet:
Das war erst einmal nur ein Testverzeichnis mit wenig Daten.
Beim Ausführen kommt keine Meldung aber es werden auch keine Dateien kopiert.
Habe verschiedene Listen getestet:
1. nur Bildname (AB12345)
2. Bildname mit Endung (AB12345.jpg)
3. Variante 1+2 mit dem kompletten Pfad.
Was mache ich falsch?
Über Hilfe wäre ich dankbar.
VG
Eldebs
nachdem ich schon einige Foren durch habe und am Verzweifeln bin, muss ich doch mal direkt nachfragen und um Hilfe bitten.
Auch ich möchte div. Dateien anhand einer Liste (txt, o.ä.) suchen (Hauptverzeichnis inkl. Unterverzeichnisse) und die gefundenen Dateien in ein bestimmtes Zielverzeichnis kopieren. Klasse, wäre noch, wenn eine Art Log erstellt werden würde von den Dateien, die nicht gefunden wurden aber das ist optional. Bin ja schon froh, wenn ich knapp 700 Dateien nicht von Hand suchen muss.
Ich arbeite an einem Windows-Rechner (Windows 7) und habe folgendes Script in einer Batch-Datei verwendet:
@echo off &setlocal
set "sourceRoot=C:\Users\user13\Desktop\Dateisuche-Kopieren\lager\"
set "sourceList=C:\Users\user13\Desktop\Dateisuche-Kopieren\art-liste.txt"
set "destFolder=C:\Users\user13\Desktop\Dateisuche-Kopieren\kopie\"
for /f "delims=" %%i in ('dir /a:-d /b /s "%sourceRoot%\*.jpg"^|findstr /ig:"%sourceList%"') do (
copy "%%~i" "%destFolder%\"
)
PAUSE
Das war erst einmal nur ein Testverzeichnis mit wenig Daten.
Beim Ausführen kommt keine Meldung aber es werden auch keine Dateien kopiert.
Habe verschiedene Listen getestet:
1. nur Bildname (AB12345)
2. Bildname mit Endung (AB12345.jpg)
3. Variante 1+2 mit dem kompletten Pfad.
Was mache ich falsch?
Über Hilfe wäre ich dankbar.
VG
Eldebs
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 305714
Url: https://administrator.de/contentid/305714
Ausgedruckt am: 01.11.2024 um 02:11 Uhr
8 Kommentare
Neuester Kommentar
Du verwendest mehrfach doppelte Backslash, einmal hier
"%sourceRoot%\*.jpg"
obwohl in der Variablen sourceRoot schon ein Backslash vorhanden ist.
Ebenso hier:
"%destFolder%\"
In der Variablen destFolder ist im Pfad ebenfalls schon ein Backslash drin ...
Gruß skybird
"%sourceRoot%\*.jpg"
obwohl in der Variablen sourceRoot schon ein Backslash vorhanden ist.
Ebenso hier:
"%destFolder%\"
In der Variablen destFolder ist im Pfad ebenfalls schon ein Backslash drin ...
Gruß skybird
Moin eldebs,
von der Idee her hätte es durchaus funktionieren konnen, undf auch die Hilfe bei FINDSTR /? rät nicht ausdrücklich ab.
Aber damit FINDSTR /G:<dateiMitSuchwerten> in deinem Fall funktionieren kann müsste der Inhalt der art-liste.txt so aussehen:
Also alle Backslashes hätten mit einem vorangestellten Backslash als "Literal"=Zeichen ohne besondere Bedeutung maskiert sein müssen.
ist aus der Hilfe nicht wirklich ersichtlich.
Ich würde NICHT empfehlen, mit einem Texteditor alle Backslashes durch 2 Backslashes zu ersetzen. Is' sich albern.
Kehr doch deine Strategie um.
Momentan holst du dir auf jeden Fall die DIR-Liste mit deinen 700++ jpg-Dateien und schaust dann nach, welche davon in der Liste der 50 Dateien sind, die in deiner art-liste.txt stehen und kopiert werden sollen.
Drehe die FOR /F-Anweisung um , laufe über die Dateien, die kopiert werden sollen (die art-liste.txt) und prüfe mit IF EXIST "%%i", ob es die gibt und kopier die dann.
Grüße
Biber
von der Idee her hätte es durchaus funktionieren konnen, undf auch die Hilfe bei FINDSTR /? rät nicht ausdrücklich ab.
Aber damit FINDSTR /G:<dateiMitSuchwerten> in deinem Fall funktionieren kann müsste der Inhalt der art-liste.txt so aussehen:
C:\\Users\\user13\\Desktop\\Dateisuche-Kopieren\\lager\\1234567_01.jpg
...
ist aus der Hilfe nicht wirklich ersichtlich.
Ich würde NICHT empfehlen, mit einem Texteditor alle Backslashes durch 2 Backslashes zu ersetzen. Is' sich albern.
Kehr doch deine Strategie um.
Momentan holst du dir auf jeden Fall die DIR-Liste mit deinen 700++ jpg-Dateien und schaust dann nach, welche davon in der Liste der 50 Dateien sind, die in deiner art-liste.txt stehen und kopiert werden sollen.
Drehe die FOR /F-Anweisung um , laufe über die Dateien, die kopiert werden sollen (die art-liste.txt) und prüfe mit IF EXIST "%%i", ob es die gibt und kopier die dann.
Grüße
Biber
Moin eldebs,
noch mal zu meiner Behauptung von gestern mit den zu verdoppelnden Backslashes, weil es mit einfachen "\" nicht klappt.
Mein Test was wie folgt:
Demo am CMD-Prompt:
Aber egal, die Mimik mit "FindStr /G:" erscheint mit hier überdimensioniert.
Wenn du
... dann kannst du doch zeilenweise über die
Für jeden der dort stehenden Dateinamen wiederum kannst du den Befehl REPLACE anwenden.
Die Parameter
(will dir doch nicht die Freude nehmen, ein funktionierendes Skript selbst fertigzustellen)
Grüße
Biber
noch mal zu meiner Behauptung von gestern mit den zu verdoppelnden Backslashes, weil es mit einfachen "\" nicht klappt.
Zitat von @Eldebs:
Wollte es nun mal genau wissen und habe zum Testen die Artikelliste angepasst, aber egal ob mit "\\" oder "\" da passiert nichts.
Wollte es nun mal genau wissen und habe zum Testen die Artikelliste angepasst, aber egal ob mit "\\" oder "\" da passiert nichts.
Mein Test was wie folgt:
- ich habe alle Dateien unterhalb des Ordners "C:\Users\Biber", die der Wildcard 123*.jpg entsprechen, mit "DIR ../s /B >allejpg.txt" in ein Textfile geschrieben.
- eine der dort vorhanden 4 Zeilen habe ich in eine neue Textdatei "suchliste.txt" gepackt und die Backslashes verdoppelt.
- diese Suchliste.txt benutze ich als Dateiinput bei "Findstr /G:suchliste "
Demo am CMD-Prompt:
C:\Users\Biber>dir /b /s /a:-d 123*jpg>allejpg.txt
C:\Users\Biber>
C:\Users\Biber>type allejpg.txt
C:\Users\Biber\tempG\Backup\1234567\1234567_01.jpg
C:\Users\Biber\tempG\Backup\1234567\1234567_02.jpg
C:\Users\Biber\tempG\Backup\1234567\1234567_03.jpg
C:\Users\Biber\tempG\Backup\1234567\1234567_04.jpg
C:\Users\Biber>type suchliste.txt
C:\\Users\\Biberr\\tempG\\Backup\\1234567\\1234567_01.jpg
C:\Users\Biber>findstr /i /g:.\suchliste.txt allejpg.txt
C:\Users\Biber\tempG\Backup\1234567\1234567_01.jpg
Aber egal, die Mimik mit "FindStr /G:" erscheint mit hier überdimensioniert.
Wenn du
- die Dateinamen+Endung der Dateien kennst/weisst/zusammensuchen kannst (und in der in
sourcelist
angegebenen Datei hast) -und - alle diese Dateien unterhalb deines Verzeichnisses
sourceRoot
liegen
... dann kannst du doch zeilenweise über die
sourcelist
datei gehen mit einer FOR/F-Anweisung.Für jeden der dort stehenden Dateinamen wiederum kannst du den Befehl REPLACE anwenden.
C:\Users\Biber>replace /?
Ersetzt Dateien.
REPLACE [Laufwerk1:][Pfad1]Dateiname [Laufwerk2:][Pfad2] [/A] [/P] [/R] [/W]
REPLACE [Laufwerk1:][Pfad1]Datein. [Laufwerk2:][Pfad2] [/P] [/R] [/S] [/W][/U]
[Laufwerk1:][Pfad1]Dateiname Die Quelldatei(en)
[Laufwerk2:][Pfad2] Das Verzeichnis, in dem Dateien ersetzt
werden sollen.
/A Fügt neue Dateien dem Zielverzeichnis hinzu. Kann nicht mit den
Optionen /S oder /U verwendet werden.
/P Fordert vor dem Ersetzen oder Hinzufügen einer Datei zur
Bestätigung auf.
/R Ersetzt sowohl schreibgeschützte als auch ungeschützte Dateien.
/S Ersetzt auch Dateien in Unterverzeichnissen des
Zielverzeichnisses. Kann nicht zusammen mit der Option /A
verwendet werden.
/W Wartet am Beginn auf das Einlegen einer Diskette.
/U Ersetzt (aktualisiert) nur Dateien, die älter als die Quelldateien
sind. Kann nicht zusammen mit der Option /A verwendet werden.
Die Parameter
[Laufwerk1:][Pfad1]Dateiname Die Quelldatei(en)
kennst du doch alle, also sollte es ein lösbares Problem sein.(will dir doch nicht die Freude nehmen, ein funktionierendes Skript selbst fertigzustellen)
Grüße
Biber