Batch zum Dateien suchen und kopieren mit zusätzlichem Zeitfilter?
Hallo liebe Community,
ich bin neu hier und hätte eine Frage was das Schreiben einer Batch betrifft.
Ich muss dazu sagen, dass ich absoluter Laie bin was dieses Gebiet betrifft, da ich eigentlich Handwerker bin.
Zu meiner Aufgabe:
Ich muss eine Batch schreiben, die einen Quellordner mit vielen weiteren Unterordnern durchsucht und daraus nur die *.bmp Dateien (keine Ordner bzw. Verzeichnisstrukturen) kopieren muss, in einen Zielornder, die aber nicht älter als 10 Tage sind.
MEINE ERSTE LÖSUNG: dir/s/b/-D|for /f %i in ('find "C:\Desktop\Quelle\"') do copy "%i\*.bmp" M:\Desktop\Ziel
(funktioniert auch)
So weit so gut, nur mein PROBLEM ist, dass der Quellordner riesig ist und ca. 1 Millionen Unterordner, die wieder Unterordner haben, durchsuchen muss. (das dauert viel zu lange, die Batch muss zu beginn des Tages immer einmal durchlaufen, um die aktuellsten *.bmp Dateien im Zielordner zu haben. Zusätzlich kopiert mir diese Lösung alle jemals entandenen *.bmp Dateien.
Ich benötigte jetzt einen Tipp, wie man den Suchbefehl eingerenzen kann. Z.B.: Suche nur nach *.bmp Dateien die nicht älter als 10 Tage sind.
?????????
MEINE ZWEITE LÖSUNG: - die aber sehr viel Müll auf dem Server erzeugt:
robocopy C:\Desktop\Quelle M:\Desktop\Ziel *.bmp /MAXAGE:10 /S /XD "2016*" "2017*" "2018*" ; kopiert alle *.bmp Dateien mit Verzeichnisstruktur zum ZIEL lässt alle Ordner von 2016,17,18 aus (Ordner haben dem Namen des jeweiligen Jahrs, Monats, Tags) und kopiert nur alle Dateien die nicht älter als 10 Tage sind.
for /F "delims=#" %%i IN ('dir /ad /b /s M:\Desktop\Ziel') DO @xcopy /d "%%i\*.bmp" M:\Desktop\Ziel /y ; FOR schleife die alle *.bmp Dateien aus den, jetzt, wenigeren Ordnern auch in das Verzeichnis M:\Desktop\Ziel kopiert.
for /D %%f in (M:\Desktop\Ziel*) do rmdir /s /q %%f ; zweite FOR Schleife die jetzt alles Verzeichnisse löscht, aber keine Dateien. So dass jetzt letzt endlich nur noch die *.bmp Dateien im Zielordner sind. So wie gewünscht.
Hier ist das Problem, dass auf M:\ zu viel Datenmüll entsteht, durch das löschen.
Ich hoffe ihr lacht nicht über mein zusammengebastelten Mist.
Bin sehr dankbar wenn mir Jemand helfen könnte.
Mfg
ich bin neu hier und hätte eine Frage was das Schreiben einer Batch betrifft.
Ich muss dazu sagen, dass ich absoluter Laie bin was dieses Gebiet betrifft, da ich eigentlich Handwerker bin.
Zu meiner Aufgabe:
Ich muss eine Batch schreiben, die einen Quellordner mit vielen weiteren Unterordnern durchsucht und daraus nur die *.bmp Dateien (keine Ordner bzw. Verzeichnisstrukturen) kopieren muss, in einen Zielornder, die aber nicht älter als 10 Tage sind.
MEINE ERSTE LÖSUNG: dir/s/b/-D|for /f %i in ('find "C:\Desktop\Quelle\"') do copy "%i\*.bmp" M:\Desktop\Ziel
(funktioniert auch)
So weit so gut, nur mein PROBLEM ist, dass der Quellordner riesig ist und ca. 1 Millionen Unterordner, die wieder Unterordner haben, durchsuchen muss. (das dauert viel zu lange, die Batch muss zu beginn des Tages immer einmal durchlaufen, um die aktuellsten *.bmp Dateien im Zielordner zu haben. Zusätzlich kopiert mir diese Lösung alle jemals entandenen *.bmp Dateien.
Ich benötigte jetzt einen Tipp, wie man den Suchbefehl eingerenzen kann. Z.B.: Suche nur nach *.bmp Dateien die nicht älter als 10 Tage sind.
?????????
MEINE ZWEITE LÖSUNG: - die aber sehr viel Müll auf dem Server erzeugt:
robocopy C:\Desktop\Quelle M:\Desktop\Ziel *.bmp /MAXAGE:10 /S /XD "2016*" "2017*" "2018*" ; kopiert alle *.bmp Dateien mit Verzeichnisstruktur zum ZIEL lässt alle Ordner von 2016,17,18 aus (Ordner haben dem Namen des jeweiligen Jahrs, Monats, Tags) und kopiert nur alle Dateien die nicht älter als 10 Tage sind.
for /F "delims=#" %%i IN ('dir /ad /b /s M:\Desktop\Ziel') DO @xcopy /d "%%i\*.bmp" M:\Desktop\Ziel /y ; FOR schleife die alle *.bmp Dateien aus den, jetzt, wenigeren Ordnern auch in das Verzeichnis M:\Desktop\Ziel kopiert.
for /D %%f in (M:\Desktop\Ziel*) do rmdir /s /q %%f ; zweite FOR Schleife die jetzt alles Verzeichnisse löscht, aber keine Dateien. So dass jetzt letzt endlich nur noch die *.bmp Dateien im Zielordner sind. So wie gewünscht.
Hier ist das Problem, dass auf M:\ zu viel Datenmüll entsteht, durch das löschen.
Ich hoffe ihr lacht nicht über mein zusammengebastelten Mist.
Bin sehr dankbar wenn mir Jemand helfen könnte.
Mfg
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 398274
Url: https://administrator.de/forum/batch-zum-dateien-suchen-und-kopieren-mit-zusaetzlichem-zeitfilter-398274.html
Ausgedruckt am: 26.04.2025 um 01:04 Uhr
16 Kommentare
Neuester Kommentar

Bitte erst einmal die Forensuche bemühen, das gab es schon x mal hier.
Für Batch: Stichwort hier im Forum forfiles
https://docs.microsoft.com/en-us/windows-server/administration/windows-c ...
Oder auch mit Powershell
Oder das PS Skript als Batch konvertiert
Gruß A.
Für Batch: Stichwort hier im Forum forfiles
https://docs.microsoft.com/en-us/windows-server/administration/windows-c ...
Oder auch mit Powershell
gci 'c:\Desktop\Quelle' -Filter *.bmp -File -recurse | ?{$_.Lastwritetime -gt (get-date).AddDays(-10)} | copy-item -destination 'M:\Desktop\Ziel' -Verbose
powershell -Executionpolicy Bypass -Command "gci 'c:\Desktop\Quelle' -Filter *.bmp -File -recurse | ?{$_.Lastwritetime -gt (get-date).AddDays(-10)} | copy-item -destination 'M:\Desktop\Ziel' -Verbose"
Gruß A.

Jepp. Sie wird in Zukunft die cmd unter Windows ablösen.
Fazit wenn du auf der Windows-Platform werkelst, lerne lieber gleich die PS kennen.
Kann das dann mehr?
Ja, sehr viel mehr.Oder was ist der Vorteil an Powershell?
hat nicht mehr die ganzen Nachteile und Bugs aus den 80ern, du kannst alle Klassen des .NET Frameworks nutzen, du kannst c# , vb.net Code kompilieren, Native Win32 Support, du arbeitest objektorientiert mit Objekten und Variablen definierten Typs, und nicht nur mit String und integer, Klassensupport, es gibt 1000ende CMDLets für alle möglichen Aufgaben und und und ...und noch viel mehr das du dir jetzt aber bitte auf diversen Seiten ergooglest.Fazit wenn du auf der Windows-Platform werkelst, lerne lieber gleich die PS kennen.

Zitat von @chris543:
Okay, dann werde ich mich gleich auf PS umstellen.
Ich bekomme leider eine Fehlermeldung bei diesem Skript:
Get-ChildItem : Es wurde kein Parameter gefunden, der dem Parameternamen "File" entspricht.
Das kommt wenn deine PS zu alt ist <3.0, also besser gleich ein Update des Management Frameworks machen. Könnte ich dir zwar für PS2.0 umschreiben aber besser du machst das Update gleich, denn dann umgehst du viele Bugs der alten 2er Version.Okay, dann werde ich mich gleich auf PS umstellen.
Ich bekomme leider eine Fehlermeldung bei diesem Skript:
Get-ChildItem : Es wurde kein Parameter gefunden, der dem Parameternamen "File" entspricht.
Ich vermute, dass Problem ist, dass der Ornder 'Quelle' mehrere Unterordner hat, wo das .bmp liegen kann oder?
Nein. Aber den Recurse Parameter hatte ich tatsächlich vergessen, ist oben ergänzt.
Zitat von @chris543:
Noch was meinerseits: Um eine "Powershell-Batch" zu erstellen, muss ich den Befehl inkl. dem Vorsatz -powershell -Executionpolicy Bypass -Command-, in den Editor eingeben und als .bat speichern?!
Jepp oder direkt in die CMD-Konsole knallenNoch was meinerseits: Um eine "Powershell-Batch" zu erstellen, muss ich den Befehl inkl. dem Vorsatz -powershell -Executionpolicy Bypass -Command-, in den Editor eingeben und als .bat speichern?!
Das heisst ja, dass PS praktisch nur über cmd ausgeführt werden kann, sehe ich das richtig?
Nein, das war nur ein Beispiel wie man Powershell Befehle über eine Batch starten kann!
Zitat von @chris543:
ich bins mal wieder. PS ist aktualisiert und ich habe es gestestet, an einem kleinen Quellordner. Funktioniert einwandfrei.
War zu erwarten.ich bins mal wieder. PS ist aktualisiert und ich habe es gestestet, an einem kleinen Quellordner. Funktioniert einwandfrei.
Es gibt aber wieder ein kleines Problem, wenn der Quellpfad auf dem richtigen Ordner liegt (mit ca. 1000000Dateien) passiert in der PS-Konsole nichts.
Wahrscheinlich zu lange Pfade.Meine Vermutung: Das Skript durchsucht wieder alle Ordner
So ist es ja auch gedacht, wie soll sie sonst alle Dateien finden??, und fängt wahrscheinlich bei den ersten jemals entstandenen Ordnen an (sind von 2016).
Das kannst du mit dem CMDLet Sort-Object mit in die Pipeline eingebaut selbst bestimmen und mit where-object schon ausfiltern! Wir kennen deine Struktur ja nicht! Nutze das Handbuch und lese dich ein!Somit sehe ich nichts in PS-Konsole, weil es eine Ewigkeit dauert bis die Suche in die -10 Tage-Grenze läuft.
Nö, läuft hier mit 100.000.000 Files problemlos, deine Ordnerstruktur wird fehlerhaft sein, oder die Platte stirbt.Gibt es noch Möglichkeiten wie man das Lösen könnte?
Das ist die Lösung, nutze sie einfach richtig.
Sicher, hättest du auch selbst rausgefunden indem du es probierst. Also üben üben und nochmals üben
.
Ciao.
Ciao.

Nein. Du darfst nur einen Filter an einer Stelle definieren, und nicht zusätzlich mit dem -Filter Parameter. Beides zusammen geht nicht, entweder oder.
Beschäftige dich mal mit Regex, damit geht noch viel mehr in der Hinsicht! Der Filesystem Filter ist da primitiv und kennt nur grundlegende Wildcards.
müsste das ja auch so funktionieren: C:\Quelle\20[18-19]*\Images
Nein dort dürfen nur einzelne Ziffern als Range rein"C:\Quelle\201[8-9]\Images"
Beschäftige dich mal mit Regex, damit geht noch viel mehr in der Hinsicht! Der Filesystem Filter ist da primitiv und kennt nur grundlegende Wildcards.
Es dauert nun 5 min bis das Skript die ganzen Daten durchwühlt hat... das ist aktzeptabel.
Besser gleich am Server durchführen lassen, dann hast du nicht den extremen Netzwerkoverhead zum denn enumerieren von Files der Größenordnung über SMB ist sau langsam.