如何从 Powershell 中的对象列表中获取特定字段的列表



我是Powershell脚本的新手。如果我错过了一些简单的东西,请道歉。

假设我有一个名为object的对象,它有一个名为field的字段。现在让我们列出这些对象。

如何以相同的顺序获取字段列表?

在python中,它将是:

list_of_objects = [o1, o2, o3]
list_of_fields = [i.field for i in list_of_object]

PowerShell 很好,但不是很好,因为它为你解开了集合,有时这可以隐藏它正在屏蔽元素的成员。 当你使用$parents.item时,你正在访问数组的方法,并尝试访问它的成员(没有任何成员,所以 powershell 给你$null):

Item           ParameterizedProperty System.Object IList.Item(int index) {get;set;}

您可以使用我在评论中共享的方法遍历每个成员并避免这种屏蔽来解决此问题:

$list = $parents | ForEach-Object -MemberName item
$list.registration.parentCompoundNumber

或者,更多人熟悉的语法:

$list = $parents | Select-Object -ExpandProperty item

或自己展开:

# you could directly assign the outputs of a `foreach` loop to a variable by
# removing these comments (<##>)
<# $items = #> 
foreach ($parent in $parents) {
$parent.item.registration.parentCompoundNumber
}

要查看此掩码何时发生,请考虑使用一元数组运算符的示例:

, @('a', 'b', 'c') | Get-Member

这将允许您观察包装数组或集合的成员。

为了补充Maximilian Burszley的有用答案:

链接答案包含成员名称冲突的可行解决方法;让我添加一个PSv4+ 替代方案,它比基于管道的方法更简洁、更快捷:

$parent.ForEach('item').registration.parentCompoundNumber

使用带有属性名称('item')的.ForEach()数组方法可以明确地针对元素的成员。


对为什么需要解决方法的解释进行轻微的重构

  • PowerShell 的成员访问枚举实质上将$someCollection.someProp视为编写了foreach ($element in $someCollection) { $element.someProp };也就是说,枚举$someCollection的元素,并将元素的.someProp属性值作为数组返回。

    • 注意:与管道中一样,如果集合恰好只有一个元素,则该元素的属性值将按原样返回,而不是作为单元素数组返回。
  • 但是,如果集合类型本身恰好有一个名为someProp的成员,则使用该成员,并且不会进行枚举;也就是说,集合级成员会隐藏(优先于)同名的元素级成员 - 这就是.Item在您的情况下发生的情况。

    • 如有疑问,输出$someCollection.someProp交互方式/在调试期间查看其计算结果。

最新更新