Powershell XML 计数子节点

问题描述 投票:0回答:1
powershell xml-parsing
1个回答
0
投票

tl;博士

mclayton在评论中提供了关键指针:

您在 Windows PowerShell 中看到一个 bug(见下文),此问题已在 PowerShell (Core) 7 中修复。

解决方法将管道包含在

@(...)
数组子表达式运算符)中,以确保它们的输出成为数组,您可以访问其
.Count
属性;例如:

$found_elements =
  @($ConfigXML.SelectNodes("//CreationFile/function") | Where-Object $DriveFilter)

背景资料:

自 v3 起,PowerShell 统一处理标量和类似数组的集合,通过提供 内在属性,允许您像对待数组一样对待标量(单个对象),即通过公开

 .Count
属性(和
.Length
别名)报告
1
(例如尝试
(Get-Date).Count
),并通过允许索引,用
[0]
[-1]
报告对象本身(例如,
(Get-Date)[0]
)与
Get-Date
相同) - 除非标量的类型本身实现了此类成员。

当前的错误是,在 Windows PowerShell

[System.Xml.XmlNode]
实例中,not 意外地具有内在
.Count
(和
.Length
)属性,即使它们应该具有。

重要的原因是,尽管

SelectNodes()
方法始终返回类型为 System.Xml.XmlNodeList
 的(n 个类似数组的)节点
list
,其中 确实 具有
.Count
属性, PowerShell 的自动枚举行为将其元素逐一流式传输到管道;如果
Where-Object
调用过滤器仅在这些元素中的 one 中进行过滤,则捕获变量中的管道输出将捕获该元素 as-is;只有两个或更多输出对象(必要时)被捕获在数组中。

因此,如果您的管道仅输出 one 节点,则由于缺乏内在

.Count
属性,您尝试在
XmlNode
实例上调用
$null
会悄悄地计算为
.Count

随后尝试在此 $null 值 (

$found_elements.count.ToString("n0")
) 上调用
方法
因此会导致您看到的错误。

如前所述,确保管道输出始终收集在数组中,即使只有一个(或没有)输出对象,使用

@(...)
可以解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.