次のようなパイプラインにいくつかのオブジェクトがあります。
$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
ここまでは順調ですね。問題は、パイプライン内の一部のオブジェクトに 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
結果:
objname props
------- -----
obj1 {@{val=11; pname=prop1}, @{val=xx; pname=prop2}}
obj2 {}
今、私はそのコマンドを期待します:
$arr2 | select objname -ExpandProperty props
次のような結果が返されます (obj2 の追加の props はありませんが、「デフォルト」プロパティ objname でまだパイプラインにあります):
val pname objname
--- ----- -------
11 prop1 obj1
xx prop2 obj1
obj2
代わりに obj2 がありません:
val pname objname
--- ----- -------
11 prop1 obj1
xx prop2 obj1
展開するものが何もない場合、ExpandProperty がオブジェクトをそのままにしないのはなぜですか?