0

我有一个 PSCustomObject 数组,上面有几个属性。一些属性是整数,一些字符串,还有一些是我推测的字典对象(这些对象是从 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
 -------------------------------------------------------------

但是,我无法有条件地检查这个 ia PSCustomObject。我尝试过的所有条件都属于 else 条件。我尝试用 [Dictionary] 和 [HashTable] 替换 [PSCustomObject]。请注意,检查类型无济于事,因为它们似乎都是 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 回答