Benutzer mit den meisten Antworten
XML unter PowerShell v2

Frage
-
Hallo zusammen,
ich brauche einmal eure Hilfe! Ich habe ein PowerShell Script unter PSv3 entwickelt und in diesem nötigen Parameter in einer XML Datei ausgelagert, damit diese Parameter von Dritte angepasst werden können ohne dass diese im Script etwas ändern müssen. Außerdem will ich auch einige Parameter ändern und in die XML zurückschreiben können.
[xml] $conf = Get-Content -Path 'C:\blaBla\issJaMalEgal.xml'
Und hier noch die XML Datei (etwas vereinfacht):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <xml> <metadata> <version>1.0</version> <release>2013-07-01</release> <requireLicenseAcceptance>false</requireLicenseAcceptance> </metadata> <files> </files> <parameters> <dateFormat>%Y-%m-%d</dateFormat> <timeStampFormat>%Y-%m-%d %H:%M:%S</timeStampFormat> <logPath>C:\Logs\</logPath> <logFileExtension>.log</logFileExtension> <computerName>default</computerName> <downTimeDuration>180</downTimeDuration> <services> <name>service1</name> <name>service2</name> <name>service3</name> </services> <pause>60</pause> <autoStartOkay>false</autoStartOkay> <onReboot>false</onReboot> </parameters> </xml>
Auf dem Server, auf dem das Script laufen soll, läuft aber nur PSv2 und die XML Verarbeitung scheint unter v2 etwas Komplizierter bzw. Aufwändiger zu sein.
z.B ein einfacher Abruf eines Parameters unter v3:
$conf.xml.parameters.logPath
und unter v2 schein nur folgendes zu funktionieren:
$conf.SelectSingleNode('/xml/parameters/logPath').InnerText
Oder eine ForEach Schleife unter v3:
ForEach ($c in $conf.xml.parameters.services.name) {$c}
und unter v2:
ForEach($c in $conf.SelectSingleNode('/xml/parameters/services').ChildNodes) {$c.InnerText}
Das Ändern von Parametern und anschließende Zurückspeichern ins XML-File (siehe unten v3) hab ich noch gar net rausbekommen ob und wie es geht.
$conf.xml.parameters.computerName = Get-Content -Path 'env:computername' $conf.Save('C:\blaBla\issJaMalEgal.xml')
Mein Problem:
Wenn ich das Script jetzt auf die oben aufgeführte v2-Kompatible Notation umstelle wird mein Script doch sehr unübersichtlich. Kennt ihr vllt. eine einfachere Notation die unter v2 funktioniert oder habt ihr eine andere Idee?
Vielen Dank schon mal!
Cailore
- Bearbeitet Cailore Mittwoch, 3. Juli 2013 16:14 Formatierung angepasst
Antworten
-
Wenn in einem Property eine Liste von Werten steht (Array) dann muss man unter PowerShell V. 2.0
Die Select-Object –ExpandProperty Schreibweise benutzt werden.
In der PowerShell V. 3.0 werden solche mehrwertigen Properties automatisch expandiert (automatic unrolling).
PowerShell V. 2.0 Beispiel
$conf.xml | Select-Object -ExpandProperty parameters # und dann ($conf.xml | Select-Object -ExpandProperty parameters).logPath
Deshalb klappt das nicht in der V. 2.0 !
Die meisten XML Beispiele im Internet vergessen eine sehr wichtige Zeile! :
$rootNode = $conf.get_DocumentElement()
Mit dem Root-Knoten kannst du dich weiter durch hangeln wie gewohnt!
$rootNode.parameters.logPath
Werte setzen ist dann auch wieder einfach!
# vergiss Get-Content nimm diese schreibweise! (ist schneller!) $rootNode.parameters.computerName = $env:computername $conf.Save('C:\temp\test.xml')
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!
- Bearbeitet Peter Kriegel Donnerstag, 4. Juli 2013 07:16 dfgvfbfdg
- Als Antwort markiert Cailore Donnerstag, 4. Juli 2013 07:46
Alle Antworten
-
Wenn in einem Property eine Liste von Werten steht (Array) dann muss man unter PowerShell V. 2.0
Die Select-Object –ExpandProperty Schreibweise benutzt werden.
In der PowerShell V. 3.0 werden solche mehrwertigen Properties automatisch expandiert (automatic unrolling).
PowerShell V. 2.0 Beispiel
$conf.xml | Select-Object -ExpandProperty parameters # und dann ($conf.xml | Select-Object -ExpandProperty parameters).logPath
Deshalb klappt das nicht in der V. 2.0 !
Die meisten XML Beispiele im Internet vergessen eine sehr wichtige Zeile! :
$rootNode = $conf.get_DocumentElement()
Mit dem Root-Knoten kannst du dich weiter durch hangeln wie gewohnt!
$rootNode.parameters.logPath
Werte setzen ist dann auch wieder einfach!
# vergiss Get-Content nimm diese schreibweise! (ist schneller!) $rootNode.parameters.computerName = $env:computername $conf.Save('C:\temp\test.xml')
Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
My PowerShell Blog http://www.admin-source.info
[string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
German ? Come to German PowerShell Forum!
- Bearbeitet Peter Kriegel Donnerstag, 4. Juli 2013 07:16 dfgvfbfdg
- Als Antwort markiert Cailore Donnerstag, 4. Juli 2013 07:46