Powershell:当数组中只剩下一个对象时如何正确计算对象数组中的项目数

Powershell: How to properly count number of items in array of objects when there is only one object left in array

我有一个对象数组,每个对象都有 N 个属性。 我像这样使用 Where-Object 执行子集操作,例如:

$mySubset = $myArrayOfObjects | Where-Object {($_.Property1 -eq 'ABC') -and ($_.Property2 -eq 'DEF')}

然后我需要检查这个数组中有多少个对象。我这样做:

$mySubset.Count

当子集数组中有多个对象时,它会显示对象的数量。但是当我在 $mySubset 中只剩下一个对象时 - 它不会将其视为具有一个元素的数组,并且 $mySubset.Count returns N - 每个对象中的属性数。这就是问题。 在这种情况下,如何说服 Powershell 将 $mySubset 视为包含 1 项的数组?

看起来是这样的:

$mySubset = [PSObject[]]($myArrayOfObjects | Where-Object {($_.Property1 -eq 'ABC') -and ($_.Property2 -eq 'DEF')})

或者,作为一个班轮:

([PSObject[]]($myArrayOfObjects | Where-Object {($_.Property1 -eq 'ABC') -and ($_.Property2 -eq 'DEF')})).Count

重点是把括号放在正确的位置,例如

[PSObject[]]($myArrayOfObjects | Where-Object {($_.Property1 -eq 'ABC') -and ($_.Property2 -eq 'DEF')}).Count

如果剩下的对象数量是一个,仍然会显示 N 而不是“1”。

最符合 PowerShell 习惯的解决方案是使用 @()array-subexpression operator,它确保命令的输出被视为数组,即使只有 one[=24] =] 返回对象:

$mySubset = @($myArrayOfObjects | ...)

直接获取计数:@($myArrayOfObjects | ...).Count

您还可以使用 [array] 类型约束 - 本质上,将强制转换放置在目标变量的 left - 这不需要修改右手:

[array] $mySubset = $myArrayOfObjects | ...

有时这种行为很方便,但并非总是如此....

幸运的是,解决方法很简单:

$mySubset = @($myArrayOfObjects | Where-Object {($_.Property1 -eq 'ABC') -and ($_.Property2 -eq 'DEF')})

只需将结果放入数组结构中:@()

尝试以下操作:

$mySubset=@()
$mySubset += $myArrayOfObjects | Where {$_.Property1 -eq 'ABC' -and $_.Property2 -eq 'DEF'}

$mySubset.Count

我创建了一个空数组。我为 Property1 和 Property2 分别为“ABC”和“DEF”的对象筛选 $myArrayOfObjects,并将其保存到 $mySubset。然后我给你一个从$mySubset.