我在管道中有一些对象,如下所示:
$arr1 = @(
(New-Object -TypeName psobject -Property @{'objname'='obj1';props=@((new-object -typename psobject -Property @{'pname'='prop1';'val'=11;}),(new-object -typename psobject -Property @{'pname'='prop2';'val'='xx';}))}),
(New-Object -TypeName psobject -Property @{'objname'='obj2';props=@((new-object -typename psobject -Property @{'pname'='prop2';'val'='yy';}),(new-object -typename psobject -Property @{'pname'='prop3';'val'=22;}))})
)
$arr1 | select objname, props
结果:
objname props
------- -----
obj1 {@{val=11; pname=prop1}, @{val=xx; pname=prop2}}
obj2 {@{val=yy; pname=prop2}, @{val=22; pname=prop3}}
我需要展开道具并将每个展开的属性与对象名称一起列出。没什么比这更简单了:
$arr1 | select objname -ExpandProperty props
结果:
val pname objname
--- ----- -------
11 prop1 obj1
xx prop2 obj1
yy prop2 obj2
22 prop3 obj2
到目前为止一切顺利。当管道中的某些对象没有道具时,问题就开始了:
$arr2 = @(
(New-Object -TypeName psobject -Property @{'objname'='obj1';props=@((new-object -typename psobject -Property @{'pname'='prop1';'val'=11;}),(new-object -typename psobject -Property @{'pname'='prop2';'val'='xx';}))}),
(New-Object -TypeName psobject -Property @{'objname'='obj2';props=@()})
)
$arr2 | select objname,props
结果:
objname props
------- -----
obj1 {@{val=11; pname=prop1}, @{val=xx; pname=prop2}}
obj2 {}
现在我希望,那个命令:
$arr2 | select objname -ExpandProperty props
会返回这样的结果(对于obj2没有额外的道具,但它仍然在使用它" s"默认"属性objname):
val pname objname
--- ----- -------
11 prop1 obj1
xx prop2 obj1
obj2
而是缺少obj2:
val pname objname
--- ----- -------
11 prop1 obj1
xx prop2 obj1
如果没有什么可扩展的话,为什么ExpandProperty不会单独留下我的对象?
答案 0 :(得分:1)
因此,这是ExpandProperty的有趣用法。在文档中指出:“如果指定了Property参数,则Select-Object将尝试将每个选定的属性作为NoteProperty添加到每个输出的对象中。” (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-object?view=powershell-3.0)
所以发生的事情是,您要告诉它从$ arr2数组中选择objname属性,并在扩展时将其作为note属性添加到道具中的每个项目。之所以看不到obj2,是因为它没有道具,所以没有对象可以添加objname。
授予这没有任何意义,当我阅读文档时,我做了两遍。也许其他人可以启发我他们为什么添加此行为。有点奇怪。这就是为什么它看起来像这样。