Jump to content

Skript für Ordnerstruktur teilweise kopieren


Direkt zur Lösung Gelöst von BOfH_666,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo Zusammen,

 

gerne möchte ich mich näher mit dem Thama Skripting befassen.

 

Unsere Firmendaten liegen alle auf dem Server wo sie hingehören. Nun möchten wir gerne einen Teil unserer Daten über ein NAS für unsere Mitarbeiter freigeben. (QNAP NAS mit Qfile App) Denen soll es von der Baustelle aus ermöglicht werden, per Smartphone/Tablet Zugriff auf Planunterlagen zu bekommen. Die Daten müssen also vom Server Share auf das SMB Share des NAS kopiert werden.

 

Meine Gedanke ist es ein Skript zu erstellen, dass regelmäßig prüft ob es neue Ordner/Dateien gibt und diese ggf. kopiert.

 

Ordnerstruktur auf dem Server:

 

M:\Projekte_20\200323_Name Ort Bezeichnung

  • Vorgaenge
  • Bilder
  • Korrespondenz
  • Planunterlagen
  • usw...

 

Auf dem NAS soll das dann so aussehen:

 

N:\Projekte\Projekte_20\200323_Name Ort Bezeichnung

  • Bilder
  • Planunterlagen

 

Aktuell sind das 10 Terrabyte Daten, die durchsucht werden müssten. Pro Jahr sind es ca. 1000 Projektordner. Ist es bei dieser Menge überhaupt noch sinnvoll oder lege ich damit mein ganzes System lahm? :D

 

Und welchen Weg würdet ihr mir dazu empfehlen? Eine Batchdatei mit xcopy oder wäre das die falsche herangehensweise?

 

Wenn eine Datei in der Quelle nicht mehr vorhanden ist, sollte sie dann auch am Ziel (also NAS) gelöscht werden). Zum Beispiel wenn eine PDF Datei gelöscht wird und mit einem _Re01 neu gespeichert wird.

bearbeitet von noobi
Link zu diesem Kommentar
vor 54 Minuten schrieb noobi:
 

N:\Projekte\Projekte_20\200323_Name Ort Bezeichnung

  • Bilder
  • Planunterlagen

... es geht also genau genommen um 2 Ordner mit Unterordnern?

Zitat

Aktuell sind das 10 Terrabyte Daten, die durchsucht werden müssten. Pro Jahr sind es ca. 1000 Projektordner. Ist es bei dieser Menge überhaupt noch sinnvoll oder lege ich damit mein ganzes System lahm? :D

Das hängt stark von der Leistung der beteiligten Komponenten und "Verteilung/Aufteilung" der 10 Terrabyte und wieviel sich in welchem Zeitraum ändert bzw. wie oft das aktualisiert werden muss.

Zitat

Und welchen Weg würdet ihr mir dazu empfehlen? Eine Batchdatei mit xcopy oder wäre das die falsche herangehensweise?

Vielleicht nicht xcopy aber robocopy.

Zitat

Wenn eine Datei in der Quelle nicht mehr vorhanden ist, sollte sie dann auch am Ziel (also NAS) gelöscht werden). Zum Beispiel wenn eine PDF Datei gelöscht wird und mit einem _Re01 neu gespeichert wird.

robocopy mit Schalter /purge oder /mir.

bearbeitet von BOfH_666
Link zu diesem Kommentar
vor 21 Minuten schrieb BOfH_666:

... es geht also genau genommen um 2 Ordner mit Unterordnern?

Der Ordner Projekte wäre bei allen identisch, dann gibt es eben N:\Projekte\Projekte_20 , N:\Projekte\Projekte_19 , N:\Projekte\Projekte_18 usw...

 

vor 21 Minuten schrieb BOfH_666:

Das hängt stark von der Leistung der beteiligten Komponenten und "Verteilung/Aufteilung" der 10 Terrabyte.

Nunja, der Server auf dem der Befehl ausgeführt wird ist dann eine VM mit Windows Server 2019. Anbindung per 10G Kupfer an ein QNAP NAS ebenfalls per 10G. Der Fileserver ist mit 2 Kernen und 4GB RAM geplant, kann aber noch angepasst werden, sofern notwendig.

 

vor 21 Minuten schrieb BOfH_666:

robocopy mit Schalter /purge oder /mir. 

okay, muss ich mir mal reinziehen...

 

Im Prinzip müsste dann ab dem Verzeichnis Projekte_20 geprüft werden ob ein Unterordner Planunterlagen vorhanden ist, wenn ja, dann kopiere die Unterordner X,Y,Z. Ideal dann natürlich das auch noch bedingt anhand des Dateinamens... (*.pdf im Ordner Planunterlagen, BE-*.pdf im Ordner Vorgaenge usw.)

bearbeitet von noobi
Link zu diesem Kommentar
vor 43 Minuten schrieb noobi:

Der Ordner Projekte wäre bei allen identisch, dann gibt es eben N:\Projekte\Projekte_20 , N:\Projekte\Projekte_19 , N:\Projekte\Projekte_18 usw...

Ah ... hatte ich falsch verstanden ... sollte aber auch kein Problem sein.

vor 43 Minuten schrieb noobi:

Nunja, der Server auf dem der Befehl ausgeführt wird ist dann eine VM mit Windows Server 2019. Anbindung per 10G Kupfer an ein QNAP NAS ebenfalls per 10G. Der Fileserver ist mit 2 Kernen und 4GB RAM geplant, kann aber noch angepasst werden, sofern notwendig.

Das war weniger als Frage gemeint, sondern eher als Hinweis, dass das von verschiedenen Faktoren abhängig ist, deren genaue Auswirkungen auf die endgültige Performance man schwer vorhersagen kann.

vor 43 Minuten schrieb noobi:

okay, muss ich mir mal reinziehen...

... das kann nie schaden ... ;-) 

vor 43 Minuten schrieb noobi:

Im Prinzip müsste dann ab dem Verzeichnis Projekte_20 geprüft werden ob ein Unterordner Planunterlagen vorhanden ist, wenn ja, dann kopiere die Unterordner X,Y,Z. Ideal dann natürlich das auch noch bedingt anhand des Dateinamens... (*.pdf im Ordner Planunterlagen, BE-*.pdf im Ordner Vorgaenge usw.)

OK ... vielleicht schaust Du Dir erstmal die vielfältigen Möglichkeiten an, die man schon mit der Kommandozeile von robocopy hat. Und wenn das nicht genügt und Du dann trotzdem noch Unterstützung beim Script brauchst, kannst Du ja hier wieder fragen.  :thumb1: ;-)

Link zu diesem Kommentar

Naja, der robocopy Befehl ist noch das geringste Problem,

 

hier würde ich folgende Optionen wählen:

 

  • /s
    Kopiert Unterverzeichnisse. Beachten Sie, dass bei dieser Option leere Verzeichnisse ausgeschlossen werden.

  • /purge
    Löscht Zieldateien und-Verzeichnisse, die in der Quelle nicht mehr vorhanden sind

  • /Mon:<1 >
    Überwacht die Quelle und wird erneut ausgeführt, wenn mehr als 1 Änderungen erkannt werden.

 

Problem ist eher die ganze herangehensweise an diese Baustelle. Hier müsste ich dann vermutlich mit einer Schleife arbeiten. Es müsste geprüft werden ob es den Ordner *_Zeichnungen gibt (hier wurde mal die Verzeichnisstruktur geändert, war mal B02_Zeichnungen, aktuell D02_Zeichnungen, das würde ich gerne auch variabel lassen, falls hier ein User kreativ wird...

 

\\Projekte\Projekte_*\*\*_Zeichnungen\*.*

 

Wenn irgendeine Datei im Verzeichnis *_Zeichnungen vorhanden ist, dann kopiere Ordner alle Dateien BE-*.pdf aus dem Ordner Vorgaenge, den kompletten Ordner *_Zeichnungen, den kompletten Ordner *_Listen an den neuen Pfad

 

Die Abfrage müsste ja dann für jeden Projektordner erstellt werden. Sollte man dann die Projektnummern mit Änderungen in eine Variable schreiben und dann später beim kopieren wieder entsprechend durch eine Schleife jagen? Man man man, hatte mal beim Anwendungsentwickler ein paar Tage .net, ist aber schon wieder ne Weile her... :rolleyes:

 

Oder würdest du das anders lösen? Kannst du ein gutes Wiki oder ähnliches zu dem Thema empfehlen? Tue mir da auch im Netz sehr schwer etwas passendes zu finden...

  1. Prüfen ob es einen Ordner *_Zeichnungen gibt (leider funktioniert das so noch nicht? Muss ich ein anderes Zeichen für die Wildcards nutzen?
if exist P:\Projekte_*\*\*_Zeichnungen\*.*
Link zu diesem Kommentar
vor 8 Minuten schrieb noobi:
  • /Mon:<1 >
    Überwacht die Quelle und wird erneut ausgeführt, wenn mehr als 1 Änderungen erkannt werden.

 

Wie aktuell muss das denn sein? Würde es z.B. auch genügen, wenn das einmal am Tag oder mehrfach am Tag zu definierten Zeiten passiert?

vor 8 Minuten schrieb noobi:

Problem ist eher die ganze herangehensweise an diese Baustelle. Hier müsste ich dann vermutlich mit einer Schleife arbeiten. Es müsste geprüft werden ob es den Ordner *_Zeichnungen gibt (hier wurde mal die

Gibt es denn in der Verzeichnisstruktur so viele Ordner oder Dateien, die nicht kopiert werden sollen? Falls nicht, kann man diese Ordner/Dateien vielleicht einfach vom Copy-Job ausschließen?

vor 8 Minuten schrieb noobi:

Verzeichnisstruktur geändert, war mal B02_Zeichnungen, aktuell D02_Zeichnungen, das würde ich gerne auch variabel lassen, falls hier ein User kreativ wird...

Je kreativer die Anwender werden (werden dürfen), desto aufwändiger und auch fehleranfälliger wird eine automatisierte Lösung.

vor 8 Minuten schrieb noobi:

Wenn irgendeine Datei im Verzeichnis *_Zeichnungen vorhanden ist, dann kopiere Ordner alle Dateien BE-*.pdf aus dem Ordner Vorgaenge, den kompletten Ordner *_Zeichnungen, den kompletten Ordner *_Listen an den neuen Pfad

Häh?  ... ist so ein komplexes Regelwerk wirklich nötig?

vor 8 Minuten schrieb noobi:

Die Abfrage müsste ja dann für jeden Projektordner erstellt werden. Sollte man dann die Projektnummern mit Änderungen in eine Variable schreiben und dann später beim kopieren wieder entsprechend durch eine Schleife jagen? Man man man, hatte mal beim Anwendungsentwickler ein paar Tage .net, ist aber schon wieder ne Weile her... :rolleyes:

Kann man alles machen, aber ... 

vor 8 Minuten schrieb noobi:

Oder würdest du das anders lösen?

... ich arbeite gern nach dem KISS-Prinzip. Ich würde wenn möglich, wenn ich das alles richtig verstanden habe, den Inhalt des Ordners Projekte mittels einer möglichst einfachen robocopy-Kommandozeile in den Zielordner kopieren. 

vor 8 Minuten schrieb noobi:

Kannst du ein gutes Wiki oder ähnliches zu dem Thema empfehlen? Tue mir da auch im Netz sehr schwer etwas passendes zu finden...

... das ist schon eine ziemlich spezielle Anforderung ... dafür direkt etwas Passendes zu finden, wird wohl nicht funktionieren.

vor 8 Minuten schrieb noobi:
  1. Prüfen ob es einen Ordner *_Zeichnungen gibt (leider funktioniert das so noch nicht? Muss ich ein anderes Zeichen für die Wildcards nutzen?

if exist P:\Projekte_*\*\*_Zeichnungen\*.*

Das sieht nach VBScript aus - da muss ich passen. Und wenn Du vorhast, Dich noch ne Weile in Windows-Infrastruktur-Umgebungen rumzutreiben, würde ich Dir empfehlen, Dir die Grundlagen von Powershell anzueigenen. Das ist meiner Meinung nach deutlich einfacher als VBScript und Du findest auch deutlich mehr Unterstüzung im Netz. (und auch hier ;-) )

Das Vorhanden-Sein eines bestimmten Pfades - egal ob Datei oder Ordner machst Du mit Powershell ungefähr so:

Test-Path -Path 'P:\Projekte_*\*\*_Zeichnungen\*'

 

 

Link zu diesem Kommentar
vor einer Stunde schrieb BOfH_666:

Wie aktuell muss das denn sein? Würde es z.B. auch genügen, wenn das einmal am Tag oder mehrfach am Tag zu definierten Zeiten passiert?

Naja, theoretisch würde es ausreichen 1x nachts, jedoch kommt es auch hin und wieder vor, das mal was schnell benötigt wird... Gut, dass könnte man aber auch zur Not händisch anschubsen... Müsste man mal testen wie schnell das ganze von statten geht...

 

vor einer Stunde schrieb BOfH_666:

Gibt es denn in der Verzeichnisstruktur so viele Ordner oder Dateien, die nicht kopiert werden sollen? Falls nicht, kann man diese Ordner/Dateien vielleicht einfach vom Copy-Job ausschließen? 

Ja, es sind schon viele Ordner, die nicht kopiert werden sollen. Grob gesagt 1/4 der Ordner soll kopiert werden.

 

vor einer Stunde schrieb BOfH_666:

Je kreativer die Anwender werden (werden dürfen), desto aufwändiger und auch fehleranfälliger wird eine automatisierte Lösung. 

Naja, die Pfade erstellt das ERP automatisch. So oft kommt es hier eigentlich nicht zu Änderungen. In den letzten Jahren war das jetzt 2x der Fall. Im Fall der Fälle, könnte man dann ja auch das Skript anpassen.

 

vor einer Stunde schrieb BOfH_666:

Häh?  ... ist so ein komplexes Regelwerk wirklich nötig? 

Im Prinzip kann er alle Ordner kopieren, nur bei Vorgaenge liegen auch Angebote, Rechnungen usw, auf die ebenfalls kein Zugriff sein soll... In vielen Ordnern gibt es einen Archiv-Ordner mit alten Daten, die revisioniert wurden. Die müssten nicht kopiert werden. Daher der Gedanke nach *.pdf in den bestimmten Ordnern zu suchen.

 

vor einer Stunde schrieb BOfH_666:

Das klingt gut :cool:

 

vor einer Stunde schrieb BOfH_666:

Und wenn Du vorhast, Dich noch ne Weile in Windows-Infrastruktur-Umgebungen rumzutreiben, würde ich Dir empfehlen, Dir die Grundlagen von Powershell anzueigenen. 

Ja, das ist schon länger mein Plan, wenn da nur nicht das Problem mit der Zeit wäre. :D Aber daher ja auch eingangs die Frage welchen Weg hier geeignet wäre.

 

 

Wie sieht denn dein Gedanke dazu aus? Grundsätzlich alles kopieren und dann bestimmte Ordnernamen ausschließen? Ich stehe hier voll auf dem Schlauch, wie ich robocopy mitteilen soll, was er tun soll :cry3: Wie ich das korrekt selektiere oder eben bestimmte Ordner abwähle.

Link zu diesem Kommentar
  1. Möchte nicht jedes Android Handy unserer Mitarbeiter auf unseren Server lassen. Die haben ein WLAN zum Datenabgleich der Zeiterfassung usw. sowie Internetzugang. Auf dem Server liegen alle Daten, für die Mitarbeiter ist ja nur ein Bruchteil der Daten relevant.
  2. Auf ein kleines NAS haben Sie Zugriff, dort sollen dann nur die relevanten Daten bereit liegen...
Link zu diesem Kommentar

/mon möchtest Du nicht verwenden. Das grast rekursiv die Quelle durch - jede Minute - und legt damit gerne mal was lahm... Erst recht nicht über UNC-Pfade - damit haben Azubis bei uns mal ein Messe-Netzwerk verstopft, indem das auf jedem Client lief... /mon ist KEIN Filesystem Watcher, das ist sinngemäß ein stupider DIR /S mit Suche nach Timestamps neuer als der letzte Aufruf.

Link zu diesem Kommentar
  • 2 Wochen später...

Guten Morgen,

 

das Thema ist nicht vergessen, nur die Zeit ist wie immer Mangelware :D

 

Am 6.4.2020 um 22:12 schrieb daabm:

/mon möchtest Du nicht verwenden. Das grast rekursiv die Quelle durch - jede Minute - und legt damit gerne mal was lahm... Erst recht nicht über UNC-Pfade - damit haben Azubis bei uns mal ein Messe-Netzwerk verstopft, indem das auf jedem Client lief... /mon ist KEIN Filesystem Watcher, das ist sinngemäß ein stupider DIR /S mit Suche nach Timestamps neuer als der letzte Aufruf.

Okay, danke für den Tipp!

 

Habe nochmal überlegt wie ich das ganze Vereinfachen könnte. Ich würde das ganze reduzieren und nur 1x Nachts ausführen. Damit die Auswahl der Unterordner vereinfacht wird, würde ich die Ordnerstruktur mit einem Präfix versehen. Also zum Beispiel alle Unterordner die kopiert werden sollen mit einem B versehen.

 

B01_Bilder

B02_Planunterlagen

usw...

 

Dann könnte ich mit einem PowerShell Skript nach B??_ suchen.

 

Dann kann er ja im Prinzip von Laufwerk M alle Ordner (Projekte_2020, Projekte_2019,...) kopieren und eben alle Unterordner die mit B??_ beginnen. Doch wie bringe ich das in mein Skript? :hmmm: Also die reine Auswahl zwecks den Unterordnern? Wäre euch für einen Tipp sehr dankbar.

bearbeitet von noobi
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...