Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

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

Frage Microsoft Windows Tools

Mitglied: e1nste1n

e1nste1n (Level 1) - Jetzt verbinden

15.03.2012 um 00:21 Uhr, 4482 Aufrufe, 3 Kommentare

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:
01.
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:
01.
$source = gci -path "Q:\uelle" -r *.typ 
02.
$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:
01.
"Test-Path \\Ziel\Ordner"
Filtere auf Typ: Ordner:
01.
... | Where {$_.psIsContainer -eq $true}
Vergleiche Elemente (und nehme nur die "Seite" von A nach B):
01.
Compare-Object $source $target -property FullName -PassThru | Where-Object { $_.SideIndicator -eq '=>' }
Für jedes Element prüfe Bedingung und führe etwas aus:
01.
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 )


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

Vielen Dank schon einmal vorab!

Mit freundlichen Grüßen ... eini
Mitglied: mak-xxl
15.03.2012 um 00:46 Uhr
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
Bitte warten ..
Mitglied: e1nste1n
19.03.2012 um 21:17 Uhr
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 ).

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?
Bitte warten ..
Mitglied: mak-xxl
19.03.2012 um 22:37 Uhr
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 ).

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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (18)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...