我是PowerShell脚本的新手。很抱歉,如果我错过了一些简单的事情。
假设我有一个名为object
的对象,该对象具有一个名为field
的字段。现在,让我们列出这些对象。
我如何以相同的顺序获取字段列表?
在python中应该是:
list_of_objects = [o1, o2, o3]
list_of_fields = [i.field for i in list_of_object]
答案 0 :(得分:2)
powershell很好,但不是很好,因为它为您解开了集合,有时这可能掩盖了它掩盖了元素的成员。使用$parents.item
时,您正在访问数组的方法,并尝试访问其成员(没有成员,因此powershell给您{ {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
以查看其结果。