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

13

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 (por exemplo, preciso pesquisar o item, criar se não existir e modificar o valor)
  • Lidar com a sintaxe XML diferente no mesmo arquivo XML, como esses:

Sintaxe 1:

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

Sintaxe 2:

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

Sintaxe 3:

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

Qualquer ajuda seria muito apreciada.

Obrigado.

    
por Serieofilo 03.03.2013 / 22:33

1 resposta

25

O PowerShell suporta totalmente o tratamento de arquivos XML.

Por exemplo, se pegarmos a primeira mensagem que você forneceu e apenas colá-la em um arquivo XML chamado settings.xml na pasta "C: \ blah", você poderia obter o ID de cada configuração como tal:

[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 pela sinopse que você forneceu na sintaxe # 2:

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

retorna:

0

Para ler crossfade , altere-o (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 comentários:

Para alterar os elementos XML em si (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 "Skinsettings", tente algo como:

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

Confira estes recursos:

por 03.03.2013 / 23:10