Como modificar / criar valores em arquivos XML usando o PowerShell?


24

Gostaria de saber se é possível modificar / criar valores em arquivos XML usando o PowerShell. Basicamente, estou interessado em:

  • Modifique os valores no arquivo XML ou crie-os se eles não existirem (ou seja, preciso pesquisar o item, criar se não existir e modificar o valor)
  • Lide com sintaxe XML diferente no mesmo arquivo XML, como os seguintes:

Sintaxe 1:

<configurações>
  <setting id = "Location2" value = "Barcelona, ​​Espanha" />
  <ID da configuração = "Location2id" value = "zmw: 00000.1.08181" />
</settings>

Sintaxe 2:

<configurações>
    <musicplayer>
        <crossfade> 0 </crossfade>
        <queuebydefault> false </queuebydefault>
    </musicplayer>
</settings>

Sintaxe 3:

<configurações>
    <configurações de peles>
        <setting type = "bool" name = "skin.confluence.HomepageHideRecentlyAddedVideo"> false </setting>
    </skinsettings>
</settings>

Qualquer ajuda será muito apreciada.

Obrigado.

Respostas:


36

O PowerShell oferece suporte total ao lidar com arquivos XML.

Por exemplo, se pegarmos o primeiro resumo fornecido e colá-lo em um arquivo XML denominado settings.xmlna pasta "C: \ blah", você poderá obter o ID de cada configuração da seguinte forma:

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

Que retorna:

Location2
Location2id

E

$myXML.settings.setting.value

retorna:

Barcelona, Spain
zmw:00000.1.08181

Se substituirmos o conteúdo do arquivo XML pelo resumo que você forneceu na sintaxe nº 2:

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

retorna:

0

Para ler crossfade, altere (para 2) e salve de volta:

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

Editar após os comentários:

Alterar os próprios elementos XML (como no exemplo de Barcelona) é um pouco mais complicado, porque você está editando a estrutura XML em si, não os dados que ela contém.

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

Para o exemplo de Skinsettings, tente algo como:

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

Confira estes recursos:


Obrigado pela resposta. Li suas sugestões e estou tentando atualizar o valor de id = "Location2" no primeiro blob de Barcelona para Nova York sem sucesso. O mesmo com o terceiro blob (tentando mudar para "true"). Como posso encontrar / modificar esses tipos de valores?
Serieofilo

Estou tentando selecionar o nó que quero alterar usando o seguinte $MyXML.SelectSingleNode("/settings/skinsettings/setting[@type='bool' and @name='skin.confluence.HomepageHideRecentlyAddedVideo']"), mas como posso alterar o valor de "false" para "true". Ou como posso criar um nó como este se ele não existir?
Serieofilo

11
Confira minha edição. Eu adicionei mais algumas informações. :)
Ƭᴇcʜιᴇ007
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.