elevator
Goto Top

XML-Datei: Pfade suchen, verlinkte Dateien kopieren und Pfade ändern

Hallo,
das Programm "Solidworks Composer" speichert Pfadangaben verlinkter Dateien in Projektdateien. Ich möchte nun diese Projektdateien inklusive aller verlinkten Dateien sichern (In Indesign heißt diese Funktion "Verpacken"). Eine solche Funktion bietet das Programm leider nicht an.

Daher suche ich eine Möglichkeit, in der XML-Projektdatei (projekt.smgXml)

a) die Pfade zu finden (IsInstanceOf="..\..\..\..\..\BA\123.xml") ...es sind i.d.R. mehrere
b) die dort erwähnten Dateien in ein separates, neu zu erstellendes Unterverzeichnis "Links" zu kopieren
c) den Pfad in der XML-Projektdatei auf das neue Verzeichnis "Links" zu ändern (ändern zu: IsInstanceOf="\links\123.xml") und
d) die Projektdatei unter einem anderen Namen zu speichern (projekt_links.smgXml)

Hier ein Ausschnitt der Ursrünglichen smgXml-Datei:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><DocumentSMG Version="7.000000" VersionSeemage="7.0.2.2836"><CLitAssyGroup Ident="AV_TS8XXX-T-1-TS8-E01_ASM" IsInstanceOf="..\..\..\..\..\BA123.xml" NodeType="0"><Neutral><Actor.Location><Frame/><Pivot><Origin X="92.78575" Y="1015.802" Z="41.96082"/><VX X="1" Y="0" Z="0"/><VY X="0" Y="1" Z="0"/></Pivot></Actor.Location><Actor.Name Value="V_TS8XXX-T-1-TS8-E01_ASM"/></Neutral></CLitAssyGroup></DocumentSMG>

Ich arbeite mit Windows 7 und ich vermute, das könnte mit vbs funktionieren, habe leider jedoch hier noch keine ausreichende Erfahrung und bitte daher um Hilfe.
Vielen Dank im Voraus.

Content-Key: 306541

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

Ausgedruckt am: 19.03.2024 um 09:03 Uhr

Mitglied: colinardo
colinardo 08.06.2016, aktualisiert am 09.06.2016 um 13:23:21 Uhr
Goto Top
Hallo ELEVATOR,
mit einem kleinen Powershell-Skript schnell gemacht (Kommentare findest du im Skript für jede Zeile):

Gehe ich in der Annahme das die Pfade in den XML Dateien alles Relative sind statt Absolute ?

# Ordner der die SMGXML Dateien enthält (wird rekursiv durchsucht)
$folderSource = 'C:\Projekte'  
# Ordner der im Anschluss die Projekte enthält (für jede XML-Projektdatei wird ein neuer Ordner darin erstellt)
$folderTarget = 'D:\Projekt-Backup'  

# Finde alle *.smgxml Dateien in Quellordner
gci $folderSource -Filter *.smgxml -recurse | %{
    $xmldir = $_.DirectoryName
    # Name des Projektordners = Basename der Datei
    $projectTargetFolder = "$folderTarget\$($_.Basename)"  
    # Unterordner Links im Projektordner
    $projectTargetFolderLinks = "$projectTargetFolder\Links"  
    # Erstelle Ordner falls noch nicht vorhanden
    If(!(Test-Path $projectTargetFolderLinks)){md "$projectTargetFolderLinks" -Force | out-null}  
    
    #XML Datei auslesen und alle Instanzen des Attributs 'IsInstanceOf' finden 
    $xml = New-Object XML; $xml.Load($_.Fullname)
    $xml.SelectNodes('//*[@IsInstanceOf]') | %{  
        # Datei der Ressource in den Zielordner kopieren
        copy-item ([System.IO.Path]::Combine($xmldir,$_.IsInstanceOf)) -Destination $projectTargetFolderLinks
        # Link in der XML-Datei aktualisieren
        $_.IsInstanceOf = ".\Links\$([System.IO.Path]::GetFileName($_.IsInstanceOf))"  
    }
    # geänderte SMGXML-Datei im Zielordner speichern nach Schema {BASENAME}_LINKS.{EXTENSION}
    $xml.Save("$projectTargetFolder\$($_.Basename)_links$($_.Extension)")  
}
Grüße Uwe
Mitglied: ELEVATOR
ELEVATOR 09.06.2016 um 08:21:46 Uhr
Goto Top
Hallo Uwe,

danke - das ist ja cool. Du hast mir sehr weitergeholfen. Vielen Dank.

Beim Testen habe ich noch das Problem, dass der freundliche User, der die Dateien und Pfade angelegt hat, mit Umlauten in Pfaden arbeitet (was natürlich suboptimal ist, und womit man somit ja auch nicht rechnen kann).

Im Ergebnis führt das beim Attribut:

IsInstanceOf="..\..\..\Produkte\Kabine rechts ohne Tür\datei1.smgXml

beim Kopieren zu der Fehlermeldung

Copy-Item : Der Pfad "D:\Delme\Produkte\Kabine rechts ohne Tür\datei.smgXml" kann nicht gefunden werden, da er nicht vorhan
den ist.


Hast Du auch hierfür noch ein Lösung - das wäre toll, dann wäre das Problem wohl komplett erledigt.

Vielen Dank noch mal.
Mitglied: colinardo
Lösung colinardo 09.06.2016 aktualisiert um 08:32:19 Uhr
Goto Top
Eigentlich dürften Umlaute hier kein Problem sein, da wird wohl das Programm kein BOM in die Datei geschrieben haben. Habe es mal geringfügig angepasst, probier es jetzt nochmal.
Ansonsten stell mir solch ein File mal zum Download, damit ich der Sache auf den Grund gehen kann.

Grüße Uwe
Mitglied: ELEVATOR
ELEVATOR 09.06.2016 um 12:45:02 Uhr
Goto Top
Hallo Uwe,
prima, klasse ganz herzlichen Dank - läuft so, wie es soll. Ich denke, ich sollte micht mit der Powersehell doch mal intensiver auseinandersetzen.

Ich wünsche Dir einen sonnigen Tag