Comment modifier / créer des valeurs dans des fichiers XML à l'aide de PowerShell?

24

Je voudrais savoir s'il est possible de modifier / créer des valeurs dans des fichiers XML à l'aide de PowerShell. Fondamentalement, je suis intéressé par:

  • Modifiez les valeurs dans le fichier XML ou créez-les si elles n'existent pas (c'est-à-dire que je dois rechercher l'élément, créer s'il n'existe pas et modifier la valeur)
  • Traitez différentes syntaxes XML dans le même fichier XML comme celles-ci:

Syntaxe 1:

<paramètres>
  <setting id = "Location2" value = "Barcelone, Espagne" />
  <setting id = "Location2id" value = "zmw: 00000.1.08181" />
</settings>

Syntaxe 2:

<paramètres>
    <musicplayer>
        <crossfade> 0 </crossfade>
        <queuebydefault> false </queuebydefault>
    </musicplayer>
</settings>

Syntaxe 3:

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

Toute aide serait très appréciée.

Merci.

Serieofilo
la source

Réponses:

36

PowerShell prend entièrement en charge le traitement des fichiers XML.

Par exemple, si nous prenons le premier texte descriptif que vous avez fourni et que nous le collons dans un fichier XML nommé settings.xmldans le dossier "C: \ blah", vous pouvez obtenir l'ID de chaque paramètre en tant que tel:

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

Qui retourne:

Location2
Location2id

Et

$myXML.settings.setting.value

Retour:

Barcelona, Spain
zmw:00000.1.08181

Si nous remplaçons le contenu du fichier XML par le texte de présentation que vous avez fourni dans la syntaxe # 2:

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

Retour:

0

Pour le lire crossfade, changez-le (en 2) et sauvegardez:

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

Modifier après les commentaires:

Changer les éléments XML eux-mêmes (comme dans l'exemple de Barcelone) est un peu plus délicat, car vous modifiez la structure XML elle-même, pas les données qu'elle contient.

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

Pour l'exemple Skinsettings, essayez quelque chose comme:

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

Consultez ces ressources:

Ƭᴇcʜιᴇ007
la source
Merci d'avoir répondu. J'ai lu vos suggestions et j'essaie de mettre à jour la valeur de id = "Location2" dans le premier blob de Barcelone à New York sans succès. La même chose avec le troisième blob (en essayant de passer à "vrai"). Comment puis-je trouver / modifier ces types de valeurs?
Serieofilo
J'essaie de sélectionner le nœud que je veux changer en utilisant ce qui suit, $MyXML.SelectSingleNode("/settings/skinsettings/setting[@type='bool' and @name='skin.confluence.HomepageHideRecentlyAddedVideo']")mais comment puis-je changer la valeur de "false" en "true". Ou comment puis-je créer un nœud comme celui-ci s'il n'existe pas?
Serieofilo
1
Découvrez ma modification. J'ai ajouté plus d'informations. :)
Ƭᴇcʜιᴇ007