我是 powershell 脚本的新手。抱歉,如果我遗漏了一些简单的东西。
假设我有一个名为的对象object
,它有一个名为 的字段field
。现在让有这些对象的列表。
如何以相同的顺序获取字段列表?
在python中它将是:
list_of_objects = [o1, o2, o3]
list_of_fields = [i.field for i in list_of_object]
我是 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
这将让您观察包装数组或集合的成员。
链接的答案包含成员名称冲突的可行解决方法;让我添加一个 PSv4+ 替代方案,它比基于管道的方法更简洁、更快:
$parent.ForEach('item').registration.parentCompoundNumber
使用带有属性名称 ( ) 的.ForEach()
数组方法'item'
可以明确地针对元素的成员。
对为什么需要变通方法的解释稍作重新解释:
PowerShell 的成员枚举本质上$someCollection.someProp
就像您编写了foreach ($element in $someCollection) { $element.someProp }
; 即$someCollection
枚举 的元素,并将元素的.someProp
属性值作为数组返回。
但是,如果集合类型本身恰好有一个名为 的成员someProp
,则会使用它,并且不会进行枚举;也就是说,集合级成员隐藏(优先于)同名的元素级成员 - 这就是.Item
您的情况。
$someCollection.someProp
请在调试期间以交互方式输出以查看其评估结果。