You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

代码说明:

  1. 直接遍历查询到的$targetDevices,每个$device就是当前要处理的设备节点,不需要再次发起查询。
  2. 使用CloneNode($true)直接复制原有的name节点,确保内容完全一致,避免手动赋值出错。
  3. 插入位置保持你原来的需求:在vlan节点之后添加cert节点。

执行这段代码后,你会得到预期的结果:每个匹配的device节点下都会生成正确的cert/name节点,第三个设备的cert里name会是G-VDS-ENC002。

内容的提问来源于stack exchange,提问作者shakex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 23:37:34