【问题标题】:ExpandProperty - objects missing from pipelineExpandProperty - 管道中缺少对象
【发布时间】:2016-05-21 00:17:04
【问题描述】:

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

$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}}

我需要展开 props 并在对象名称旁边列出每个展开的属性。再简单不过了:

$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 不会让我的对象不理会?

【问题讨论】:

  • 奇怪的一点不是obj2 在扩展属性props 时消失(这实际上是包含空数组的属性的预期行为),而是该属性获得了一个额外的元素@987654332 @如果它包含一个对象数组。您应该只看到valpname 列。

标签: powershell pipeline powershell-5.0 psobject pscustomobject


【解决方案1】:

所以这是 ExpandProperty 的一个有趣用法。在文档中,它指出“如果指定了属性参数,则 Select-Object 将尝试将每个选定的属性作为 NoteProperty 添加到每个输出的对象中。” (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-object?view=powershell-3.0)

所以发生的事情是您告诉它从 $arr2 数组中选择 objname 属性,并在展开时将其作为注释属性添加到 props 中的每个项目。你没有看到 obj2 的原因是它没有道具,所以没有对象可以添加 objname。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    相关资源
    最近更新 更多