Batch Windows findstr Dateien verschieben wenn gefunden

Tribo0n

Lt. Commander
Registriert
Okt. 2007
Beiträge
1.214
Hallo zusammen,
habe ein Problem mit meinem Windows Batch Script.
Ich möchte alle Dateien aus einem Ordner (alles JPG Bilder) nach einem String durchsuchen, wenn gefunden soll er das Bild in ein Unterverzeichnis verschieben.

Mein Code klappt aber nicht...
Code:
FOR /F %%i IN ('findstr /M "Test" I:\Test\') DO move /y %%i I:\Test\Suchergebnis
Zudem, wie kann ich es machen das er alle Unterordner im Verzeichnis I:\Test abarbeitet und dann die gefundenen Bilder in ein Unterverzeichnis legt.
z.B.:
  1. I:\Test -> I:\Test\Suchergebnis
  2. I:\Test2 -> I:\Test2\Suchergebnis
  3. I:\Test3 -> I:\Test2\Suchergebnis
 
Füge der Findstr Zeile mal den Parameter "/s" zu, damit auch die Unterverzeichnisse abgearbeitet werden.
 
Tribo0n schrieb:
Mein Code klappt aber nicht...
Magst du uns auch verraten was nicht klappt?

Immerhin willst du ausgehend von einer Trefferliste aus findstr (1) in einer Schleife (2) Dateien verschieben (3).

1) Hast du findstr direkt in der Kommandzeile getestet und es kommt die erwartete Trefferliste?
2) Hast du in der Schleife einfach mal nur mit echo die Trefferliste ausgegeben?
3) Werden überhaupt irgendwelche von den Dateien verschoben?
 
Habe den Code angepasst, aber die Batch läuft im Hintergrund laut Taskmanager auf hochtouren. Aber es passiert nichts. Nichts wird verschoben. Das CMD Fenster zeigt nichts an. Es sind zum testen auch nur ein paar Dateien im Ordner...
Code:
@echo off
FOR /F %%i IN ('findstr /s "Testbegriff" I:\Test') DO move /y %%i I:\Test\Suchergebnis
pause
Es soll keine Liste erstellt werden sondern die gefundenen Ergebnisse direkt verschoben werden.
 
Jpg Dateien sind binär und enthalten Bilddaten, keine Strings. Findstr wird da kläglich versagen.

Meintest Du im Dateinamen? Da reicht ein simples DIR.

Meintest Du eine graphisch Repräsentation von Text in der Bilddatei? Dann wird es signifikant schwieriger.


Ps, mit dem Ansatz würde der Datenstamm inkonsistent. Von 1000 Dateien blieben exakt 100% erhalten, aber eine im Stammpfad, eine in SE 1, eine weitere in SE 15. Nochmal die Batch laufen lassen hieße, daß immer noch 100% der ursprünglichen Dateien da sind, aber alle, die dort gefunden wurden, jetzt anderswo fehlen.

Besser: mklink /h und vorher gucken, was da passiert.
 
Zuletzt bearbeitet von einem Moderator:
Es soll in der JPG Datei gesucht werden. In der Windows Suche kann ich ja auch in JPG Dateien Suchen nach bestimmten Worten und er findet es. Deswegen dachte ich das es auch mit Batch funktioniert.
 
RalphS schrieb:
Jpg Dateien sind binär und enthalten Bilddaten, keine Strings. Findstr wird da kläglich versagen.
Jpg-Dateien können Metadaten enthalten. Afaik sind die als Text gespeichert. Findstr ist allerdings wirklich ungeeignet, da die gesamte Datei durchsucht wird, nicht nur der Exif-Header.

Man müsste also sich ein Batchfähiges Exif-Tool suchen und dann die Exif-Daten durchsuchen. Oder man benutzt ein Tool wie Advanced Renamer, der kann Verzeichnisse und Dateinamen an Hand der Exif-Daten ändern.

/edit: Man kann auch PowerShell benutzen, da kann man die Metadaten einfach abfragen.
Use PowerShell to Find Metadata from Photograph Files
 
Zuletzt bearbeitet:
Advanced Ranamer wird schlecht gehen, da kann man nur 200.000 Dateien auf einmal durchlaufen lassen (und das dauert sehr lange, habe das Programm).
Ich habe aber viel mehr Dateien (~2 Mio) die geprüft werden sollen.
Mit PowerShell kenn ich mich nicht aus. Kann mir da jemand helfen?
 
Das Skript hier nutzt das ExifTool um die Metadaten abzufragen:
Code:
@ECHO OFF

set srcDir=F:\test
set fileType=jpg
set searchTag=Creator
set searchValue=Testautor

REM Schleife über alle Dateien vom Typ fileType im Verzeichnis srcDir und Unterverzeichnisen
FOR /F %%i IN ('DIR /B /S %srcDir%\*.%fileType%') DO (
  REM Test ob Metainfo zu Tag searchTag und Wert searchValue vorhanden
  FOR /F %%n IN ('exiftool.exe -T -%searchTag% %%i ^| find "%searchValue%"') DO (
    REM wenn nicht vorhanden Zielordner anlegen
    IF NOT EXIST %srcDir%\%%n (
      mkdir %srcDir%\%%n
    )
    REM Datei verschieben
    MOVE /y %%i %srcDir%\%%n\%%~nxi
  )
)
Es macht nicht ganz das, was Du willst, ober Du kannst es ja anpassen ...
 
Tribo0n schrieb:
Mit PowerShell kenn ich mich nicht aus. Kann mir da jemand helfen?

Powershell ist eigentlich auf jeder Windows Maschine incl. Editor vorinstalliert und für Leute die sich ein bisschen in der Skriptprogrammierung auskennen eingänglich.
Außerdem gibt es sehr viel mehr Möglichkeiten und Beispiele die man verwenden kann. Das besondere an Powershell ist, dass man jederzeit aufs .net Zugriff hat was v.a. bei speziellen Problemen oder Performancerelevanten Bereichen interessant sein kann. Allerdings geht man hier dann doch sehr stark in die Programmierung.

Die Powershell ISE als brauchbarer Editor ist auf fast jedem Rechner vorinstalliert und sollte dir erstmal gute Dienste leisten.
Die installierte Powershell Version (abfragebar über $psversiontable.psversion) sollte >5 sein

Wers ganz neu mag ist mit der Preview Version von Powershell v7 + Visual Studio Code gut beraten.

Batch Skripte haben durch Powershell meiner Meinung nach Ihre Daseinsberechtigung verloren*

*Anmerkung: Außer wenn das längere Starten von Powershell ein Problem darstellt.
 
  • Gefällt mir
Reaktionen: Raijin
Zurück
Oben