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

How to get a list of a particular field from a list of objects in powershell

我是 powershell 脚本的新手。如果我遗漏了一些简单的东西,我们深表歉意。

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

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

在 python 中将是:

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

is nice, and not so nice, because it unwraps collections for you, and sometimes this can hide that it is masking the elements' members. When you're using $parents.item, you're accessing the array's method, and trying to access its members (which there aren't any, so 给你 $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

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

补充

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

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

使用带有 属性 名称 ('item') 的 .ForEach() array method 明确地定位 元素 ' 成员。


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

  • PowerShell 的 member-access enumeration 本质上将 $someCollection.someProp 视为您编写了 foreach ($element in $someCollection) { $element.someProp };即枚举 $someCollection 的元素,并将元素的 .someProp 属性 值作为数组返回。

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

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