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

时间:2019-03-29 18:15:30

标签: arrays powershell member-enumeration

我是PowerShell脚本的新手。很抱歉,如果我错过了一些简单的事情。

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

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

在python中应该是:

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

2 个答案:

答案 0 :(得分:2)

很好,但不是很好,因为它为您解开了集合,有时这可能掩盖了它掩盖了元素的成员。使用$parents.item时,您正在访问数组的方法,并尝试访问成员(没有成员,因此给您{ {1}}):

$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
  }

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

答案 1 :(得分:1)

补充TheIncorrigible1's helpful answer

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

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

使用带有属性名称('item')的.ForEach() array method明确地将 elements 的成员作为目标。


要稍微解释一下解释,说明为什么需要解决方法:

  • PowerShell的member enumeration本质上将$someCollection.someProp当作您写过foreach ($element in $someCollection) { $element.someProp }一样对待;也就是说,枚举$someCollection的元素,并将元素的.someProp属性值作为数组返回。

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

    • 如有疑问,请在调试过程中交互式地输出$someCollection.someProp以查看其结果。