0

我正在尝试使用以下 powershell 脚本更新节点值

$XMLContents = [XML] (Get-content "C:\Test.xml")
$XPath="/Parameters/Parameter[ParameterName='pTxtRuntimeUserName']/ParameterValue"
$MachineNameInXML= Select-XML -XML $XMLContents -XPath $Xpath
$Userstring=$($MachineNameInXML.Node.'#text')
$Userstring = $Userstring.Replace("WIN2K8R25\administrator","WIN2K8R25\ABC")
$Userstring
$XMLContents.Save("C:\Test.xml")

当我显示 $Userstring 时,它会正确显示替换值“WIN2K8R25\ABC”,但在 xml 文件中它没有更新。它仍然是旧用户名“WIN2K8R25\administrator”。

我的 XML 文件有很多参数节点,我单独复制了一些示例节点值。

<Parameters>
    <Parameter IsEncrypted="False">
      <ParameterName>pTxtRuntimeUserName</ParameterName> 
      <ParameterValue>WIN2K8R25\administrator</ParameterValue> 
    </Parameter>
    <Parameter IsEncrypted="False">
      <ParameterName>pTxtABC</ParameterName> 
      <ParameterValue>XYCr</ParameterValue> 
    </Parameter>
</Parameters>

我找不到我想念的地方。我在这缺少什么?

4

2 回答 2

2

在这一行:

$Userstring = $Userstring.Replace("WIN2K8R25\administrator","WIN2K8R25\ABC")

看起来您只是将$Userstring变量重新分配给一个新值,但这对 DOM 的内容没有影响。

在那之后添加一个新行怎么样:

$MachineNameInXML.Node.InnerText = $Userstring

或者您可以完全跳过使用该$Userstring变量:

$XMLContents = [XML] (Get-content "C:\Test.xml")
$XPath="/Parameters/Parameter[ParameterName='pTxtRuntimeUserName']/ParameterValue"
$MachineNameInXML= Select-XML -XML $XMLContents -XPath $Xpath
$MachineNameInXML.Node.InnerText = $MachineNameInXML.Node.InnerText.Replace("WIN2K8R25\administrator","WIN2K8R25\ABC")
$XMLContents.Save("C:\Test.xml")
于 2013-01-16T11:12:34.740 回答
1

尝试:

$path = "C:\Test.xml"
$XMLContents = [XML] (Get-content $path)
$Node = $XMLContents.SelectNodes("/Parameters/Parameter[ParameterName='pTxtRuntimeUserName']/")
$Node[0].ParameterValue = $Node[0].ParameterValue.Replace("WIN2K8R25\administrator","WIN2K8R25\ABC")
$XMLContents.Save($path)

可能是一种更好看的方法,但只要它只是一个具有该参数名的节点,它就可以工作。

于 2013-01-16T11:23:45.570 回答