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 не оставляет мой объект в покое, если нечего расширять?


person AdamL    schedule 10.02.2016    source источник
comment
Любопытный момент заключается не в том, что obj2 исчезает, когда вы расширяете свойство props (это фактически ожидаемое поведение для свойства, содержащего пустой массив), а в том, что свойство получает дополнительный элемент objname, если оно содержит массив объектов. Вы должны видеть только столбцы val и pname.   -  person Ansgar Wiechers    schedule 11.02.2016


Ответы (1)


Итак, это интересное использование ExpandProperty. В документации указано, что «Если параметр Property указан, Select-Object будет пытаться добавить каждое выбранное свойство в качестве NoteProperty к каждому выведенному объекту». (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-object?view=powershell-3.0)

Итак, что происходит, вы говорите ему выбрать свойство objname из массива $ arr2 и добавить его в качестве свойства примечания к каждому элементу в props при расширении. Причина, по которой вы не видите obj2, заключается в том, что у него нет реквизита, поэтому нет объектов, к которым можно было бы добавить имя objname.

Конечно, в этом нет никакого смысла, и я перепуталась, когда прочитала документ. Может быть, кто-нибудь еще объяснит мне, почему они добавили это поведение. Это странно. Вот почему это выглядит именно так.

person SamuelWarren    schedule 15.10.2018