いくつかのプロパティを使用して作成された PSCustomObject の配列があります。一部のプロパティはint、一部の文字列、およびその他は辞書オブジェクトであると私が推測するものです(オブジェクトはInvoke-RestMethodから返されています)ここに例があります:
> $items[0]
id : 42
name : Modularize the widget for maximum reuse
priority : {[id, 1], [order, 1], [name, High]}
project : {[id, 136], [name, Wicked Awesome Project]}
最終的に、私がやりたいことは、この構造を「平坦化」して、Export-CSV にパイプし、すべてのデータを保持できるようにすることです。各プロパティは列になります。例:
id : 42
name : Modularize the widget for maximum reuse
priority_id : 1
priority_order : order
priority_name : High
project_id : 135
project_name : Wicked Awesome Project
したがって、私の考えは、プロパティを列挙し、いずれかが Dictionary/HashTable/PSCustomObject である場合は、そのプロパティを列挙し、それらを親プロパティに追加して、この構造を平坦化することでした。
ただし、プロパティが Dictionary/HashTable/PSCustomObject であるかどうかを推測することはできませんでした。そのようにすべてのプロパティをループします。
foreach($property in $item.PsObject.Properties)
{
Write-Host $property
Write-Host $property.GetType()
Write-Host "-------------------------------------------------------------"
# if a PSCustomObject let's flatten this out
if ($property -eq [PsCustomObject])
{
Write-Host "This is a PSCustomObject so we can flatten this out"
}
else
{
Write-Host "Use the raw value"
}
}
PSCustomObject と思われるプロパティについては、次のように表示されます。
System.Management.Automation.PSCustomObject project=@{id=135}
System.Management.Automation.PSNoteProperty
-------------------------------------------------------------
ただし、これが PSCustomObject であることを条件付きで確認することはできません。私が試したすべての条件は、else 条件に該当します。[PSCustomObject] を [Dictionary] と [HashTable] に置き換えてみました。それらはすべて PSNoteProperty のように見えるため、タイプをチェックしても役に立たないことに注意してください。
プロパティが実際に PSCustomObject であるため、フラット化する必要があることを確認するにはどうすればよいですか?