Powershell, renomeando dados .xml específicos e salvando as alterações

0
Eu tenho feito bastante pesquisa / experimentação, e sei que problemas similares foram resolvidos, mas estou lutando especificamente com esse problema e estou buscando outro par de olhos. Meu objetivo é analisar um arquivo .xml para nomes, alterar os nomes e salvá-los. Meu .xml em resumo:

<?xml version="1.0"?>
<menu>
    <header>
        <listname>Thing</listname>
        <lastlistupdate>11/15/2011</lastlistupdate>
        <listversion>1.1 Final</listversion>
        <exporterversion>12.0</exporterversion>
    </header>
    <game name="My - Game (Japan) (Eu,Br)" index="true" image="0">
        <description>My - Game (Japan) (Eu,Br)</description>
        <cloneof></cloneof>
        <crc>8B70CB5B</crc>
        <manufacturer>Manufacturer</manufacturer>
        <year>1997</year>
        <genre>Shooter</genre>
        <rating>ESRB - T (Teen)</rating>
        <enabled>Yes</enabled>
    </game>
    <game name="Some Other Cool Game (Stuff) (Foo) (Bar)" index="" image="">
        <description>Some Other Cool Game (Stuff) (Foo) (Bar)</description>
        <cloneof></cloneof>
        <crc>34F0EE5B</crc>
        <manufacturer>Manufacturer</manufacturer>
        <year>2000</year>
        <genre>Shooter</genre>
        <rating>ESRB - T (Teen)</rating>
        <enabled>Yes</enabled>
    </game>

Eu preciso remover tudo depois do primeiro "(" no campo "nome do jogo" e substituir este conteúdo por "(EUA)", então o primeiro nome do jogo precisa mudar de:

My - Game (Japan) (Eu,Br)
Some Other Cool Game (Stuff) (Foo) (Bar)

Para:

My - Game (USA)
Some Other Cool Game (USA)

Estou muito perto e consigo que o Powershell imprima os nomes corrigidos com:

[xml]$gameNames = Get-Content '.\myXML.xml' $gameNames.menu.game | foreach { $_.Name -replace '(.*', "(USA)" }

O que eu não consigo descobrir é como salvar esses novos nomes nos nós do "nome do jogo". Eu tentei adicionar | Set-Content '.\myXML.xml' ao final do meu pipe, mas isso substitui o original .xml pelos nomes de jogos renomeados e nenhum dos dados originais.

* Edit: Existe um "\" antes do "(" na última linha de reposicionamento. Ele não aparece, mas (sem espaços), a linha deve se parecer com: -replace ' \ ( . * '

    
por root 14.10.2013 / 03:26

1 resposta

1
$gameNames.menu.game | foreach { $_.Name = $_.Name -replace '\(.*', "(USA)" }
    
por 14.10.2013 / 10:13