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
相同) - 除非标量的类型本身实现了此类成员。
[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")
) 上调用 方法因此会导致您看到的错误。
如前所述,确保管道输出始终收集在数组中,即使只有一个(或没有)输出对象,使用
@(...)
可以解决此问题。