e1nste1n
Goto Top

Bestimmte Dateitypen von A nach B kopieren, jedoch nur wenn Verzeichnis B existiert

Hallo *,

nach dem durchwühlen einiger Hilfeseiten und dem was sich in Google finden lässt habe ich keine Lösung für mein - anscheinend doch spezielles - Problem gefunden.

Es geht um viele Zehntausend Dateien welche im Quellverzeichnis A in beliebiger Struktur liegen können.

Weiterhin gib es ein Zielverzeichnis B in welche nun Dateien von einem Bestimmten Typ kopiert werden sollen. _Teile_ der Struktur aus A liegen bereits in exakt der gleichen Struktur in B. Die Kunst ist nun das _nur_ die Dateien (bestimmter Typen) aus A kopiert werden zu denen bereits Verzeichnisse in B existieren. Alle anderen (in B neu anzulegenden) Verzeichnisse oder Dateien in diesen sollen ignoriert werden. (Also kein Mirror der Quelle!)

Das klang für mich erst mal nach einem robocopy-befehl wie zum Beispiel:
robocopy.exe "Q:\uelle" "\\Ziel\Ordner" /S /ZB /COPY:DAT /XX *.typ  
Leider legt mir das auch die Dateien des / der gewünschten Typen aus A in Verzeichnis B in die jeweiligen Unterordner. Entweder habe nun ich die Parameter von Robocopy noch nicht ganz verstanden oder es bietet die Option das nur bereits existierende Ordner befüllt werden sollen nicht?!

Im Anschluss daran habe ich mich mit der "Verzeichnisse Synchronisieren"-Funktion des TotalCommanders beschäftigt um evtl. einen manuellen Weg zu finden, auch dort bin ich zu keiner Lösung gekommen.

Nach dem suchen und ausprobieren einiger weiterer Möglichkeiten (unter anderem einem WScript) bin ich zur Powershell gekommen, in der es - dessen bin ich mir inzw. eigentlich sicher - relativ einfach möglich sein sollte. Allein das benötigte Detail-Wissen in der Richtung fehlt mir bisher.
Mein Ansatz war den Inhalt von A und B in Variablen zu lesen:
$source = gci -path "Q:\uelle" -r *.typ  
$target = gci -path "\\Ziel\Ordner" -r *.typ  
Dann wäre das Vorhaben per Foreach A durchzugehen und zu den Verzeichnissen die auch in B existieren die gewünschten Dateitypen nach Unterverzeichnisstruktur B zu kopieren. Die einzelnen Befehle habe ich imho zusammen, nur weiß ich nicht wie ich den Kram kombiniere.
Prüfe ob Pfad Vorhanden:
"Test-Path \\Ziel\Ordner"  
Filtere auf Typ: Ordner:
... | Where {$_.psIsContainer -eq $true}
Vergleiche Elemente (und nehme nur die "Seite" von A nach B):
Compare-Object $source $target -property FullName -PassThru | Where-Object { $_.SideIndicator -eq '=>' }  
Für jedes Element prüfe Bedingung und führe etwas aus:
foreach if ($source.fullname -eq $target.Fullname) {tue dinge}

Ich bekomme wie oben geschrieben das Zusammenspiel der Bausteine nicht zusammen. (Ja, ich bin mir dessen bewusst das die einzelnen Kommandos keinen Sinn ergeben, das sind nur meine bisher erfolglosen "Ansätze" über die ich mich in Kombination an das Problem "herandenken" wollte face-smile)


Kurz zu den Systemumgebung und Voraussetzungen:
Betriebssystem: Server 2k8r2 / Win7
Pfadlängen (incl. Dateinamen) können mehr als 256 Zeichen enthalten, ebenso wie Sonderzeichen aller Art und Sprache.
Art und Weise der Lösung: Bevorzugt Powershell, andernfalls ist ein Wscript / Batchfile oder (doch bei der Suche übersehenes) Programm dafür auch recht.
Das Ganze muss nicht unbedingt automatisiert ausgeführt werden.


Momentan habe ich mich ein wenig in die Powershell-Lösung verliebt, es besteht aber kein Zwang in der Richtung, bin für neue Ideen offen face-smile

Vielen Dank schon einmal vorab!

mfg ... eini

Content-Key: 181983

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

Ausgedruckt am: 28.03.2024 um 14:03 Uhr

Mitglied: mak-xxl
mak-xxl 15.03.2012 um 00:46:06 Uhr
Goto Top
Moin eini,

da ich noch wach zu sein glaube, sei der Versuch einer Antwort gemacht:

Ich würde die Sache durchaus an robocopy delegieren. Dazu die jeweils zu kopierenden Pfade per Subroutine rekursiv (von unten nach oben) ermitteln und an robocopy übergeben. Wenn die Gefahr besteht, mit einem Unterordner in VZ:\A vorhandene (Unter-)Ordner mit zu kopieren, die in VZ:\B nicht erwünscht sind, dann hilft der Parameter "/xd *". Da der Ausschluss von Ordnern allerdings nur für die erste Unterebene gilt, muss die Subroutine durch entsprechendes Vergleichen mit VZ:\A den (vielen) möglichen Redundanzen beim Kopieren vorbeugen; bei flacher Verzeichnishirarchie ist das aber ein kleineres Problem.
Und ob die Hilfsdienste nun der WSH, die Powershell oder cmd verrichtet, auf die /mir-Funktion von robocopy muss man nicht verzichten.

Freundliche Grüße von der Insel - Mario
Mitglied: e1nste1n
e1nste1n 19.03.2012 um 21:17:02 Uhr
Goto Top
Hi Mario,

erstmal: danke für deine Antwort. Es geht mir hier um eine Summe von >10.000 Ordnern allein im Ziel, die wie erwähnt in ziemlich tiefen Strukturen liegen (das Ding mit den > 256 Zeichen im Pfad face-smile).

Wenn ich deinen Vorschlag also richtig verstehe meinst du in A jeweils einmal pro Ordner robocopy anwerfen und einfach die gewünschten Typen kopieren lassen? Das würde mir zwar nur die gewünschten Dateitypen nach B werfen, allerdings auch alle Unterordner. Was ich benötige ist ja das nur in die in B vorhandene Struktur kopiert wird.
[edit] sehe beim dritt-lesen grad den von dir erwähnten parameter /xd ... daraus schließe ich das ich mich erst bis in die vorletzte ebene durchhangeln muss um dann robocopy anzuwerfen? wie bekomme ich dann meine dateitypen in der dritt- oder viertletzten Ebene?[/edit]

Was mir inzw. noch eingefallen ist - etwas frickelig - man könnte sich ein Dir-Listing aus B nehmen, und sich daraus die Pfade in A "zusammenbasteln" (mit suchen und ersetzen) und dann für die Liste von Pfaden nen simples copy ... wobei ich mir da Gedanken mache mit >10k Pfaden im Speicher rumzuwürfeln und dann pro Zeile nen Copy auszuführen.

Kennt jemand noch einen anderen Weg?
Mitglied: mak-xxl
mak-xxl 19.03.2012 um 22:37:04 Uhr
Goto Top
Zitat von @e1nste1n:
Hi Mario,

erstmal: danke für deine Antwort. Es geht mir hier um eine Summe von >10.000 Ordnern allein im Ziel, die wie erwähnt
in ziemlich tiefen Strukturen liegen (das Ding mit den > 256 Zeichen im Pfad face-smile).

Wenn ich deinen Vorschlag also richtig verstehe meinst du in A jeweils einmal pro Ordner robocopy anwerfen und einfach die
gewünschten Typen kopieren lassen? Das würde mir zwar nur die gewünschten Dateitypen nach B werfen, allerdings auch
alle Unterordner. Was ich benötige ist ja das nur in die in B vorhandene Struktur kopiert wird.
[edit] sehe beim dritt-lesen grad den von dir erwähnten parameter /xd ... daraus schließe ich das ich mich erst bis in
die vorletzte ebene durchhangeln muss um dann robocopy anzuwerfen? wie bekomme ich dann meine dateitypen in der dritt- oder
viertletzten Ebene?[/edit]
Indem robocopy alle 2 Ebenen gerufen wird, und mit /xd alle VZ excludiert werden, die in LW A vorhanden sind, in LW B aber nicht und mit /LEV:n die VZ-Tiefe auf 1 gesetzt wird.

Was mir inzw. noch eingefallen ist - etwas frickelig - man könnte sich ein Dir-Listing aus B nehmen, und sich daraus die
Pfade in A "zusammenbasteln" (mit suchen und ersetzen) und dann für die Liste von Pfaden nen simples copy ... wobei
ich mir da Gedanken mache mit >10k Pfaden im Speicher rumzuwürfeln und dann pro Zeile nen Copy auszuführen.

Kennt jemand noch einen anderen Weg?

Viele Grüße von der Insel - Mario