Powershell替换复杂XML文件中的值



我试图替换XML文件中的DeviceAddress值并将其保存为新文件,但没有得到所需的结果。

XML文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<WinCollectConfiguration version="7.3.0.41" xmlns="event_collection/WinCollect">
<Service version="7.3.0.41" classification="Service" type="Service" module="Win" name="DestinationManager">
<InstanceData>
<Instance name="Software">
<Environment />
<Module order="1" service_name="StoreAndForwardStage">
<Environment>
<Parameter name="DataChunkPeriod" value="10" />
<Parameter name="DataProcessingPeriod" value="500000" />
</Environment>
</Module>
<Module order="2" service_name="SimpleEventThrottle">
<Environment>
<Parameter name="EventThrottleInEPS" value="5000" />
</Environment>
</Module>
<Module order="3" service_name="SyslogHeaderStage">
<Environment />
</Module>
<Module order="4" service_name="TCPSendStage">
<Environment>
<Parameter name="TargetAddress" value="0.0.0.0" />
<Parameter name="TargetPort" value="80" />
<Parameter name="Secondary" value="" />
<Parameter name="Failover" value="" />
</Environment>
</Module>
</Instance>
</InstanceData>
<Environment />
</Service>
<Service version="7.3.0.41" classification="Service" type="DeviceType" module="DeviceWindowsLog" name="DeviceWindowsLog">
<InstanceData>
<Instance enabled="true" name="SERVER">
<Environment>
<Parameter name="DeviceAddress" value="SERVER" />
<Parameter name="RemoteMachine" value="SERVER" />
</Environment>
</Instance>
</InstanceData>
<Environment>
<Parameter name="AdaptiveThreadPool.ReaderThreadsMin" value="5" />
</Environment>
</Service>
</WinCollectConfiguration>

Powershell脚本

$xmldata = [XML](Get-Content -raw 'C:Pesterconfig.xml')
$tochange = "DeviceAddress"

foreach ($add in $xmldata.WinCollectConfiguration.Service.InstanceData.Instance.Environment.Parameter)
{
$add
if ($tochange -contains $add.name)
{
$add.value = "192.168.0.1"
}

$add
}

上面的代码添加了一个新行而不是替换。我还尝试了替换函数,它给了我一个不同的结果。

name          value
----          -----
DeviceAddress SERVER
DeviceAddress 192.168.0.1
RemoteMachine SERVER
RemoteMachine SERVER
一种方法是使用SelectSingleNode():
$expression = "//*[local-name()='Parameter'][./@name='$tochange']";
$target = $xmldata.SelectSingleNode($expression);
$target.InnerText="192.168.0.1";

最新更新