PowerShell中XML节点循环修改与节点复制的正确语法实现
修复PowerShell XML节点更新问题
首先咱们来定位你代码里的核心问题:
- 在
foreach($Pat in $Pattern)循环内部,你重复用SelectSingleNode查询设备节点,这会每次都返回第一个匹配的G-VDS-ENC001节点,而不是当前循环的$Pat(也就是第二个、第三个设备),这就是为什么第三个设备的cert里name变成了ENC001。 - 多余的
foreach($name in $device)循环完全没必要,它会重复创建name元素,反而干扰了正常逻辑。 - 其实可以直接用
CloneNode()方法复制原有的name节点,比手动创建更高效准确。
下面是修正后的代码:
$LoadType = "OLD" $FileName = "C:\name.xml" [xml]$FileOriginal = Get-Content $FileName # 获取所有需要处理的device节点 $targetDevices = $FileOriginal.SelectNodes("/Configuration/Enclave[@id = `"$LoadType`"]/device[name[contains(text(), 'G-VDS-ENC')]]") foreach($device in $targetDevices) { # 直接复制当前device下的name节点(true表示深克隆,包含子内容) $clonedName = $device.name.CloneNode($true) # 创建cert节点 $certNode = $FileOriginal.CreateElement('cert') # 将克隆的name节点添加到cert下 $certNode.AppendChild($clonedName) # 在vlan节点之后插入cert节点 $device.InsertAfter($certNode, $device.SelectSingleNode('vlan')) } # 保存修改后的XML $FileOriginal.Save($FileName)
代码说明:
- 直接遍历查询到的
$targetDevices,每个$device就是当前要处理的设备节点,不需要再次发起查询。 - 使用
CloneNode($true)直接复制原有的name节点,确保内容完全一致,避免手动赋值出错。 - 插入位置保持你原来的需求:在
vlan节点之后添加cert节点。
执行这段代码后,你会得到预期的结果:每个匹配的device节点下都会生成正确的cert/name节点,第三个设备的cert里name会是G-VDS-ENC002。
内容的提问来源于stack exchange,提问作者shakex
相关产品推荐
相关产品推荐

