3

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

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

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

在python中它将是:

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

2 回答 2

4

很好,但不是很好,因为它会为您解开集合,有时这可以隐藏它正在掩盖元素的成员。当您使用$parents.item时,您正在访问数组的方法,并尝试访问成员(没有任何成员,因此为您提供$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

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

于 2019-03-29T19:33:40.697 回答
1

为了补充TheIncorrigible1 的有用答案

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

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

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


对为什么需要变通方法的解释稍作重新解释:

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

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

    • 如有疑问,$someCollection.someProp请在调试期间以交互方式输出以查看其评估结果。
于 2019-03-29T20:51:39.260 回答