0

いくつかのプロパティを使用して作成された 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 であるため、フラット化する必要があることを確認するにはどうすればよいですか?

4

2 に答える 2

2

次のコードは、PSCustomObject のプロパティが 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.TypeNameOfValue -eq "System.Management.Automation.PSCustomObject")
    {
       Write-Host "This is a PSCustomObject so we can flatten this out"
    }
    else
    {
       Write-Host "Use the raw value"
    }
}
于 2014-07-24T22:13:57.663 に答える
0

変数が指定された型であるかどうかを確認するには、比較演算子-eqではなく、型演算子を使用する必要があり-isます。

$psc = New-Object -TypeName PSCustomObject

if ($psc -is [System.Management.Automation.PSCustomObject]) {
    'is psc'
}
if ($psc -is [Object]) {
    'is object'
}
if ($psc -is [int]) {
    'is int'
} else { 
    "isn't int"
}
于 2014-07-24T15:38:40.410 に答える