¿Cómo modificar / crear valores en archivos XML usando PowerShell?

24

Me gustaría saber si es posible modificar / crear valores en archivos XML usando PowerShell. Básicamente estoy interesado en:

  • Modifique valores en el archivo XML o créelos si no existen (es decir, necesito buscar el elemento, crear si no existe y modificar el valor)
  • Trate con diferentes sintaxis XML en el mismo archivo XML como esos:

Sintaxis 1:

<configuraciones>
  <setting id = "Location2" value = "Barcelona, ​​España" />
  <setting id = "Location2id" value = "zmw: 00000.1.08181" />
</settings>

Sintaxis 2:

<configuraciones>
    <jugador de música>
        <crossfade> 0 </crossfade>
        <queuebydefault> false </queuebydefault>
    </musicplayer>
</settings>

Sintaxis 3:

<configuraciones>
    <ajustes de piel>
        <setting type = "bool" name = "skin.confluence.HomepageHideRecentlyAddedVideo"> false </setting>
    </skinsettings>
</settings>

Cualquier ayuda será muy apreciada.

Gracias.

Serieofilo
fuente

Respuestas:

36

PowerShell es totalmente compatible con el manejo de archivos XML.

Por ejemplo, si tomamos la primera propaganda que proporcionó y la pegamos en un archivo XML llamado settings.xmlen la carpeta "C: \ blah", podría obtener la ID de cada configuración como tal:

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

Que devuelve:

Location2
Location2id

Y

$myXML.settings.setting.value

devoluciones:

Barcelona, Spain
zmw:00000.1.08181

Si reemplazamos el contenido del archivo XML con la publicidad que proporcionó en la sintaxis # 2:

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

devoluciones:

0

Para leer crossfade, cámbielo (a 2) y guarde de nuevo:

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

Editar después de los comentarios:

Cambiar los elementos XML en sí mismos (como en el ejemplo de Barcelona) es un poco más complicado, porque está editando la estructura XML en sí, no los datos que contiene.

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

Para el ejemplo de Skinsettings, intente algo como:

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

Echa un vistazo a estos recursos:

Ƭᴇcʜιᴇ007
fuente
Gracias por la respuesta. He leído sus sugerencias y estoy tratando de actualizar el valor de id = "Location2" en el primer blob de Barcelona a Nueva York sin éxito. Lo mismo con el tercer blob (tratando de cambiar a "verdadero"). ¿Cómo puedo encontrar / modificar este tipo de valores?
Serieofilo
Estoy intentando seleccionar el nodo que quiero cambiar usando lo siguiente $MyXML.SelectSingleNode("/settings/skinsettings/setting[@type='bool' and @name='skin.confluence.HomepageHideRecentlyAddedVideo']")pero, ¿cómo puedo cambiar el valor de "falso" a "verdadero". ¿O cómo puedo crear un nodo como este si no existe?
Serieofilo
1
Mira mi edición. Agregué más información. :)
Ƭᴇcʜιᴇ007