如何使用PowerShell循环修改XML文件中的serialNo节点值
故障原因
现有代码无法正常工作的核心问题有4个:
- PowerShell数组索引从0起始,初始化
$i=1会跳过第一个序列号,最后一个节点会匹配到空值 - 读取的
serial.txt每行首尾存在多余空格、换行符,直接赋值会把无效空白写入XML - 内存中修改完XML节点后未执行保存操作,修改不会同步到磁盘文件
- 直接给
#text属性赋值对空内容节点兼容性差,部分场景下会出现赋值失效
可直接运行的实现代码
# 读取序列号,自动去除首尾空白、过滤空行 $serialNumbers = Get-Content ".\serial.txt" | ForEach-Object { $_.Trim() } | Where-Object { $_ } # 以UTF8编码加载XML文档 [xml]$xmlDoc = Get-Content ".\data.xml" -Encoding UTF8 # 匹配所有serialNo节点 $nodes = $xmlDoc.SelectNodes("//serialNo") # 数量校验,避免赋值错位 if ($serialNumbers.Count -ne $nodes.Count) { throw "序列号总数$($serialNumbers.Count)与XML中serialNo节点总数$($nodes.Count)不匹配,请核对源文件" } # 从索引0开始循环赋值 for ($i = 0; $i -lt $nodes.Count; $i++) { $nodes[$i].InnerText = $serialNumbers[$i] } # 保存修改到原XML文件 $xmlDoc.Save((Resolve-Path ".\data.xml").Path)
关键逻辑说明
- 读取序列号时增加了空白清理、空行过滤逻辑,避免无效字符写入节点
- 增加数量校验前置判断,防止序列号和节点数量不匹配导致的赋值错位、漏赋值问题
- 采用从0起始的索引循环,对齐PowerShell数组的下标规则
- 使用
InnerText属性赋值,对原有空白内容、空节点的兼容性更好,可稳定覆盖节点原有内容 - 最后执行Save操作将内存中的修改写入磁盘,确保修改生效
内容的提问来源于stack exchange,提问作者user2494337
相关产品推荐
相关产品推荐

