我已经进行了很多搜索/实验,我知道类似的问题已经得到解决,但我正在努力解决这个问题,并希望得到另一双眼睛的帮助。我的目标是解析 .xml 文件中的名称,修改名称,然后保存它们。我的 .xml 简介:
<?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>
我需要删除“游戏名称”字段中第一个“(”之后的所有内容,并将该内容替换为“(美国)”,因此第一个游戏名称需要从以下位置更改:
My - Game (Japan) (Eu,Br)
Some Other Cool Game (Stuff) (Foo) (Bar)
到:
My - Game (USA)
Some Other Cool Game (USA)
我已经很接近了,而且我可以用 Powershell 打印出更正后的名称:
[xml]$gameNames = Get-Content '.\myXML.xml' $gameNames.menu.game | foreach { $_.Name -replace '(.*', "(USA)" }
我不能弄清楚如何将这些新名称保存在“游戏名称”节点中。我尝试将其添加| Set-Content '.\myXML.xml'
到管道的末尾,但这只会用重命名的游戏名称覆盖原始 .xml,而不会覆盖任何原始数据。
*编辑:在最后一行 -replace 中的“(”之前有一个“\”。它没有显示出来,但是(没有空格),该行应该看起来像:-replace' \ ( . * '
答案1
$gameNames.menu.game | foreach { $_.Name = $_.Name -replace '\(.*', "(USA)" }