我正在尝试使用以下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>
我无法找到我想念的地方。我在这里缺少什么?
答案 0 :(得分: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")
答案 1 :(得分: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)
可能是一个更好看的方法,但只要它只有一个具有该paramtername的节点就可以工作。