powershell – ExpandProperty – 管道中缺少的对象

我在管道中有一些对象,如下所示:

$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没有额外的道具,但它仍然在管道中,它的“默认”属性objname):

val pname objname
--- ----- -------
 11 prop1 obj1   
 xx prop2 obj1  
          obj2

而是缺少obj2:

val pname objname
--- ----- -------
 11 prop1 obj1   
 xx prop2 obj1   

如果没有什么可扩展的话,为什么ExpandProperty不会单独留下我的对象?

最佳答案 所以这是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属性添加到props中的每个项目.你没有看到obj2的原因是因为它没有道具,所以没有对象添加objname.

当然这没有任何意义,当我阅读文档时,我做了双重考虑.也许其他人可以告诉我他们为什么添加这种行为.有点奇怪.这就是它看起来如此的原因.

点赞