根据节点值获取XML节点名称,分类Enable/Disable节点
解决方法
首先,你需要同时获取XML节点的名称和值,而不是只提取文本。下面是完整的PowerShell实现步骤:
1. 正确读取XML并获取节点信息
替换你原来的代码,改用[xml]类型直接加载XML文件,这样能更方便地访问节点属性:
# 定义XML文件路径 $xmlPath = "C:\Users\Lenovo\Desktop\shellscripts\xml\SNMP.xml" # 加载XML文件 $xml = [xml](Get-Content -Path $xmlPath) # 获取Notificationlist下的所有元素节点(过滤掉空白文本节点) $notificationNodes = $xml.Configuration.Notificationlist.ChildNodes | Where-Object { $_.NodeType -eq [System.Xml.XmlNodeType]::Element }
2. 按值分组收集节点名称
分别筛选出值为Enable和Disable的节点名称,存入两个数组:
# 收集所有值为Enable的节点名称 $enableNodes = $notificationNodes | Where-Object { $_.InnerText -eq 'Enable' } | Select-Object -ExpandProperty LocalName # 收集所有值为Disable的节点名称 $disableNodes = $notificationNodes | Where-Object { $_.InnerText -eq 'Disable' } | Select-Object -ExpandProperty LocalName
3. 格式化输出为指定表格样式
为了对齐输出,需要循环遍历两个数组的最大长度,逐行输出对应内容:
# 输出表头 "Enable Disable" "------ -------" # 确定最长数组的长度 $maxCount = [Math]::Max($enableNodes.Count, $disableNodes.Count) # 逐行输出内容 for ($i = 0; $i -lt $maxCount; $i++) { $enableItem = if ($i -lt $enableNodes.Count) { $enableNodes[$i] } else { "" } $disableItem = if ($i -lt $disableNodes.Count) { $disableNodes[$i] } else { "" } # 格式化对齐(这里用14个字符宽度对齐Enable列) "{0,-14}{1}" -f $enableItem, $disableItem }
运行结果
执行上述代码后,会输出你需要的格式:
Enable Disable ------ ------- SendEmail SendSnmp SignInEmail SignInSnmp TooManyLoginEmail TooManyLoginSnmp
内容的提问来源于stack exchange,提问作者Divyesh Jesadiya
相关产品推荐
相关产品推荐

