I have some objects in a pipeline, something like this:
$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
Result:
objname props
------- -----
obj1 {@{val=11; pname=prop1}, @{val=xx; pname=prop2}}
obj2 {@{val=yy; pname=prop2}, @{val=22; pname=prop3}}
I need to expand props and list every expanded property alongside object name. Nothing simpler:
$arr1 | select objname -ExpandProperty props
Result:
val pname objname
--- ----- -------
11 prop1 obj1
xx prop2 obj1
yy prop2 obj2
22 prop3 obj2
So far so good. The problems start when some of the objects in the pipeline have no props:
$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
Result:
objname props
------- -----
obj1 {@{val=11; pname=prop1}, @{val=xx; pname=prop2}}
obj2 {}
Now I would expect, that command:
$arr2 | select objname -ExpandProperty props
Would return result like this (no extra props for obj2, but it's still in the pipeline with it's "default" property objname):
val pname objname
--- ----- -------
11 prop1 obj1
xx prop2 obj1
obj2
Instead obj2 is missing:
val pname objname
--- ----- -------
11 prop1 obj1
xx prop2 obj1
Why ExpandProperty won't leave my object alone if there's nothing to expand?