eldebs
Goto Top

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:

@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

Content-ID: 305714

Url: https://administrator.de/contentid/305714

Ausgedruckt am: 01.11.2024 um 02:11 Uhr

beidermachtvongreyscull
beidermachtvongreyscull 30.05.2016 aktualisiert um 12:40:06 Uhr
Goto Top
Dein Script sieht OK aus.
Verwende doch anstelle von copy mal robocopy. Damit hast Du Logging drin.
Ferner:

Lasse die Ausgabe von "Dir" in eine Datei reinschreiben und gib die Robocopy als Auftragsdatei mit. Das sollte funktionieren.
Bzw.
for %a in (c:\transfer.txt) do robocopy e:\test c:\test %a
129413
129413 30.05.2016 aktualisiert um 12:43:08 Uhr
Goto Top
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
Eldebs
Eldebs 30.05.2016 aktualisiert um 13:21:24 Uhr
Goto Top
Hiho,
danke für das schnelle Feedback.

@ beidermachtvongreyscull
Leider komme ich mit der Anweisung nicht so zurecht. Hab das Script auch nur irgendwo in den Weiten des Internets gefunden und ohne großes Fachwissen versucht an meine Bedürfnisse anzupassen. Werde das aber im Hinterkopf behalten. Momentan bin ich nur froh wenn da überhaupt mal etwas passiert face-smile

@ skybird
Das war natürlich ein blöder Fehler aber leider funktioniert es nach der Anpassung immer noch nicht. Keine Fehlermeldung, keine kopierte Dateien im Zielverzeichnis. Einfach nichts.

Obwohl die Struktur aufgrund der Verzeichnisvorgabe eigentlich egal sein sollte, hier mal mein Aufbau:

[Hauptverzeichnis]
- kopier.bat
- art-liste.txt
[lager]
- bild-01.jpg
- bild-02.jpg
- bild-03.jpg
- bild-04.jpg
- bild-05.jpg
[kopie]

In der Liste stehen die Namen + Endung jeweils untereinander.

Habt ihr noch eine Idee?
Biber
Biber 30.05.2016, aktualisiert am 31.05.2016 um 16:42:28 Uhr
Goto Top
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:
C:\\Users\\user13\\Desktop\\Dateisuche-Kopieren\\lager\\1234567_01.jpg
...
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
Eldebs
Eldebs 31.05.2016 um 07:45:40 Uhr
Goto Top
Hallo Biber,
auch dir danke für deinen Beitrag.

Wollte es nun mal genau wissen und habe zum Testen die Artikelliste angepasst, aber egal ob mit "\\" oder "\" da passiert nichts.

Da ich mich mit den Befehlen nur rudimentär auskenne, gestaltet sich die Umkehrung der Strategie für mich etwas schwierig. Kannst du mir bitte ein Beispiel geben um die Grundstruktur der Schleife besser zu verstehen?
Biber
Biber 31.05.2016 aktualisiert um 17:17:21 Uhr
Goto Top
Moin eldebs,


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.

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
Eldebs
Eldebs 01.06.2016 um 10:12:56 Uhr
Goto Top
Hallo Biber,

danke erneut für den Input. Hatte kein fertiges Script, welches ich nur noch Kopieren muss erwartet, daher auch die Frage nach einem Beispiel um das Grundprinzip zu verstehen. Das oben aufgeführte Script habe ich auch aus div. Ansätzen aus div. Foren zusammengefrickelt, leider ohne Erfolg. Mein Wissen ist da leider nicht so tiefgreifend.

Sofern mir die Freude eines funktionierenden Scriptes zuteil wird, lasse ich es dich wissen.
Eldebs
Eldebs 19.07.2016 aktualisiert um 08:01:03 Uhr
Goto Top
Hallo Biber,

wie versprochen, hier mein Feedback.

Wie erwartet, wurde mir die Freude eines komplett funktionierenden Scriptes aufgrund von fehlendem Wissen nicht so richtig zuteil.

Allerdings habe ich das Problem auf etwas komplizierterem Wege gelöst, aber es funktioniert zumindest. Für alle, die ähnliche Probleme haben, hier mein Lösungsvorschlag.

Da ich die ganzen Bildnamen in Form von Nummern in einer Excel-Liste habe, habe ich mir durch Verketten eine Excel-Formel gebastelt:
="for /f ""delims="" %%a IN ('dir /b /s "&AE!F361&".jpg') do call copy ""%%a"""&" "&(WENN(H361="";"""C:\Users\user17\Desktop\bildsuche""";H361))
Die Formel muss natürlich bezüglich der Zellen den eigenen Bedürfnissen angepasst werden. Dann kopiere bzw. "ziehe" ich die Formel für alle Bildnamen so dass ich je nach Bildanzahl eine größere Liste mit den Befehlen habe.
Die kopiere ich nun in meine Batch-Datei und führe diese dann aus.
Um zu prüfen, welche Bilder kopiert wurden, führe ich am Ende der Batch noch folgenden Befehl aus:
dir C:\Users\user17\Desktop\bildsuche /b /a-d *.*>C:\Users\user17\Desktop\bildsuche\liste.txt
Aus der Liste kopiere ich mir die Inhalte in ein Excel-Blatt (entferne das ".jpg") und prüfe per SVERWEIS welche der Daten vorhanden sind.

Wie gesagt, etwas umständlich aber wenn man das Grundgerüst erst einmal hat, läuft es.