chris543
Goto Top

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

Content-Key: 398274

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

Printed on: April 19, 2024 at 12:04 o'clock

Mitglied: 137846
Solution 137846 Jan 15, 2019, updated at Jan 16, 2019 at 10:07:19 (UTC)
Goto Top
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
gci 'c:\Desktop\Quelle' -Filter *.bmp -File -recurse  | ?{$_.Lastwritetime -gt (get-date).AddDays(-10)} | copy-item -destination 'M:\Desktop\Ziel' -Verbose  
Oder das PS Skript als Batch konvertiert
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.
Member: chris543
chris543 Jan 15, 2019 at 14:46:05 (UTC)
Goto Top
Danke dir, für die schnelle Antwort.

Ich wusste nicht einmal genau, wonach ich suchen musste...

Eine Frage noch: Powershell ist sozusagen das neue cmd ? Kann das dann mehr? Oder was ist der Vorteil an Powershell?

Danke
Mitglied: 137846
137846 Jan 15, 2019 updated at 15:00:58 (UTC)
Goto Top
Zitat von @chris543:
Eine Frage noch: Powershell ist sozusagen das neue cmd ?
Jepp. Sie wird in Zukunft die cmd unter Windows ablösen.
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.
Member: chris543
chris543 Jan 16, 2019 at 10:04:37 (UTC)
Goto Top
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?

Mfg
Mitglied: 137846
137846 Jan 16, 2019 updated at 10:09:32 (UTC)
Goto Top
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.
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.
Member: chris543
chris543 Jan 16, 2019 updated at 11:38:05 (UTC)
Goto Top
Gut, da werde ich das Teil mal aktualisieren und dir dann Rückmeldung geben.

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?!
Das heisst ja, dass PS praktisch nur über cmd ausgeführt werden kann, sehe ich das richtig?
Sorry für die newby Fragen, will es nur halbwegs verstehen.
MfG
Mitglied: 137846
137846 Jan 16, 2019 updated at 11:56:39 (UTC)
Goto Top
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 knallen
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!
Member: chris543
chris543 Jan 17, 2019 at 08:15:28 (UTC)
Goto Top
Guten Morgen,

ich bins mal wieder. PS ist aktualisiert und ich habe es gestestet, an einem kleinen Quellordner. Funktioniert einwandfrei. face-smile

Es gibt aber wieder ein kleines Problem, wenn der Quellpfad auf dem richtigen Ordner liegt (mit ca. 1000000Dateien) passiert in der PS-Konsole nichts.
Meine Vermutung: Das Skript durchsucht wieder alle Ordner, und fängt wahrscheinlich bei den ersten jemals entstandenen Ordnen an (sind von 2016). Somit sehe ich nichts in PS-Konsole, weil es eine Ewigkeit dauert bis die Suche in die -10 Tage-Grenze läuft.

Gibt es noch Möglichkeiten wie man das Lösen könnte?

MfG
Mitglied: 137846
137846 Jan 17, 2019 updated at 08:32:44 (UTC)
Goto Top
Zitat von @chris543:
ich bins mal wieder. PS ist aktualisiert und ich habe es gestestet, an einem kleinen Quellordner. Funktioniert einwandfrei. face-smile
War zu erwarten.
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.
Member: chris543
chris543 Jan 18, 2019 updated at 07:05:57 (UTC)
Goto Top
Hallo answer,

ja die Pfade sind lang. Der Quellordner liegt auch auf einen Netzlaufwerk, das habe ich vegessen zu erwähnen, das macht bestimmt auch nochmal langsamer oder?

Also der Quellordner hat ca.820 000 Dateien und 300 000 Ordner.
Kurz gesagt, es sind ~16 000 solche Ornder wie im angehängten Bild, wo der Pfad des *.bmp aber immer gleich ist.

Okay ich werde mich mal einlesen, mal sehen ob ich es hinbekomme.

Ich hätte mal noch eine Frage, und zwar, kann man Wildcards denn auch in Verzeichnisspfaden anwenden?
Z.B C:\Quelle\20*\Images
So kann ich ja die Suche auf ein Minimum beschränken, weil ich ja weiß, dass jeder Ordner in "Quelle" mit 20 anfängt.
unbenannt2
Mitglied: 137846
137846 Jan 18, 2019 updated at 07:15:23 (UTC)
Goto Top
Sicher, hättest du auch selbst rausgefunden indem du es probierst. Also üben üben und nochmals üben face-wink.

Ciao.
Member: chris543
chris543 Jan 18, 2019 at 08:02:02 (UTC)
Goto Top
Leider funst es nicht mit dem *

Mache ich etwas falsch?
Mitglied: 137846
Solution 137846 Jan 18, 2019 updated at 08:15:42 (UTC)
Goto Top
Zitat von @chris543:

Leider geht es nicht mit dem *

Mache ich etwas falsch?
Jepp.
https://tio.run/##K8gvTy0qzkjNyfn/Pzc7JbNIQbdAoSS1uETfyMDQWD8zNzE9tZgLQ8 ...
Member: chris543
chris543 Jan 18, 2019 at 09:37:04 (UTC)
Goto Top
So, es funktioniert face-smile, dass Problem lag an den ' bei der Pfadangabe, wenn ich sie weglasse geht alles.
Es dauert nun 5 min bis das Skript die ganzen Daten durchwühlt hat... das ist aktzeptabel.

Ich wollte auch zum Test mal das hier probieren:

laut Wildcard 'Anleitung' https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...

müsste das ja auch so funktionieren: C:\Quelle\20[18-19]*\Images
, kommt aber eine Fehlemeldung, das die Wildcard nicht existiert. Das geht dann bestimmt nur bei Dateien oder?

Mfg
Mitglied: 137846
Solution 137846 Jan 18, 2019 updated at 09:47:16 (UTC)
Goto Top
Zitat von @chris543:

So, es funktioniert face-smile, dass Problem lag an den ' bei der Pfadangabe
Nein. Du darfst nur einen Filter an einer Stelle definieren, und nicht zusätzlich mit dem -Filter Parameter. Beides zusammen geht nicht, entweder oder.
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.
Member: chris543
chris543 Jan 18, 2019 at 10:00:25 (UTC)
Goto Top
Genau, hab das mit den ' nochmal ausprobiert, haut hin.

Und mit den einzelnen Zahlen funktioniert es dann auch. Sogar "C:\Quelle\20[1-2][8-9]*\images" funktioniert, also doppelt und dreifach. Gut zu wissen.

Ich werde mich jetzt mal mit dem Regex beschäftigen...

Hab erstmal vielen Dank, du hast es echt drauf!
MfG