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

Kai*_*hen 6 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]
Run Code Online (Sandbox Code Playgroud)

The*_*le1 6

很好,但也不是那么好,因为它会为您打开集合,有时这会隐藏它正在屏蔽元素的成员。当您使用 时$parents.item,您正在访问数组的方法,并尝试访问成员(没有任何成员,因此为您提供了$null):

Item           ParameterizedProperty System.Object IList.Item(int index) {get;set;}
Run Code Online (Sandbox Code Playgroud)

您可以通过使用我在评论中分享的方法来迭代每个成员并避免这种屏蔽来克服这个问题:

$list = $parents | ForEach-Object -MemberName item
$list.registration.parentCompoundNumber
Run Code Online (Sandbox Code Playgroud)

或者,还有一种更多人熟悉的语法:

$list = $parents | Select-Object -ExpandProperty item
Run Code Online (Sandbox Code Playgroud)

或者自己展开它:

# 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
  }
Run Code Online (Sandbox Code Playgroud)

要查看何时发生这种屏蔽,请考虑以下使用一元数组运算符的示例:

, @('a', 'b', 'c') | Get-Member
Run Code Online (Sandbox Code Playgroud)

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

  • @KaiwenChen 很高兴提供帮助。需要注意的是:使用管道(`$obj | cmdlet`)具有固有的开销,因此在足够大的数据集上,速度非常慢。 (2认同)