Ändern / Erstellen von Werten in XML-Dateien mit PowerShell

24

Ich würde gerne wissen, ob es mit PowerShell möglich ist, Werte in XML-Dateien zu ändern / zu erstellen. Grundsätzlich interessiert mich:

  • Werte in der XML-Datei ändern oder erstellen, wenn sie nicht vorhanden sind (dh ich muss das Element durchsuchen, erstellen, wenn es nicht vorhanden ist, und den Wert ändern)
  • Behandeln Sie unterschiedliche XML-Syntax in derselben XML-Datei wie die folgenden:

Syntax 1:

<Einstellungen>
  <setting id = "Location2" value = "Barcelona, ​​Spain" />
  <setting id = "Location2id" value = "zmw: 00000.1.08181" />
</ settings>

Syntax 2:

<Einstellungen>
    <Musikspieler>
        <crossfade> 0 </ crossfade>
        <queuebydefault> false </ queuebydefault>
    </ musicplayer>
</ settings>

Syntax 3:

<Einstellungen>
    <skinsettings>
        <setting type = "bool" name = "skin.confluence.HomepageHideRecentlyAddedVideo"> false </ setting>
    </ skinsettings>
</ settings>

Jede Hilfe wäre sehr dankbar.

Vielen Dank.

Serieofilo
quelle

Antworten:

36

PowerShell unterstützt den Umgang mit XML-Dateien in vollem Umfang.

Wenn wir beispielsweise den ersten von Ihnen bereitgestellten Klappentext in eine XML-Datei mit dem Namen settings.xml"C: \ blah" einfügen, können Sie die ID jeder Einstellung als solche abrufen:

[xml]$myXML = Get-Content C:\blah\settings.xml
$myXML.settings.setting.id

Welches gibt zurück:

Location2
Location2id

Und

$myXML.settings.setting.value

kehrt zurück:

Barcelona, Spain
zmw:00000.1.08181

Wenn wir den Inhalt der XML-Datei durch den Klappentext ersetzen, den Sie in Syntax 2 angegeben haben:

[xml]$myXML = Get-Content C:\blah\settings.xml
$myXML.settings.musicplayer.crossfade

kehrt zurück:

0

Zum Lesen crossfadeändere es (auf 2) und speichere es zurück:

[xml]$myXML = Get-Content C:\blah\settings.xml
$myXML.settings.musicplayer.crossfade = 2
$myXML.Save("C:\blah\settings.xml")

Nach Kommentaren bearbeiten:

Das Ändern der XML-Elemente selbst (wie im Beispiel von Barcelona) ist etwas komplizierter, da Sie die XML-Struktur selbst bearbeiten und nicht die darin enthaltenen Daten.

[xml]$myXML = Get-Content C:\blah\settings.xml
$myXML.settings.ChildNodes.Item(0).value = "New York, USA"
$myXML.Save("C:\blah\settings.xml")

Versuchen Sie für das Beispiel Skinsettings Folgendes:

$myXML.settings.skinsettings.setting."#text" = "true"

Sehen Sie sich diese Ressourcen an:

ƬᴇcƬᴇιʜ007
quelle
Danke für die Antwort. Ich habe Ihre Vorschläge gelesen und versuche, den Wert von id = "Location2" im ersten Blob von Barcelona nach New York ohne Erfolg zu aktualisieren. Dasselbe gilt für den dritten Blob (der versucht, auf "true" zu wechseln). Wie kann ich solche Werte finden / ändern?
Serieofilo
Ich versuche, den Knoten auszuwählen, den ich ändern möchte, indem ich Folgendes verwende $MyXML.SelectSingleNode("/settings/skinsettings/setting[@type='bool' and @name='skin.confluence.HomepageHideRecentlyAddedVideo']"). Wie kann ich den Wert von "false" in "true" ändern? Oder wie kann ich einen solchen Knoten erstellen, wenn er nicht existiert?
Serieofilo
1
Schau dir meine Bearbeitung an. Ich habe weitere Infos hinzugefügt. :)
ƬᴇcƬᴇιʜ007