首页 > 解决方案 > 使用多个 psobjects 时 Get-Member 不返回 NoteProperty

问题描述

由于我正在尝试处理的一些 JSON 的结构,这是我发现的奇怪行为。我只是想返回所有属性名称。这是我的 JSON:

$x = @"
[
    {
        "test":  [
            "item1"
        ]
    },
    {
        "test2":  [
            "item2"
        ]
    }
]
"@ | ConvertFrom-Json

您也可以像这样创建对象,这会导致相同的问题:

$x= @()

$x += [pscustomobject]@{
    'test' = 'item1'
}

$x += [pscustomobject]@{
    'test2' = 'item2'
}

请注意,现在,我可以$x | fl像往常一样编写和获取所有这些信息。

$x | fl


test : item1

test2 : item2

但是,使用 Get-Member 时,仅包含第一个对象。

$x | Get-Member -MemberType NoteProperty

Name MemberType   Definition       
---- ----------   ----------       
test NoteProperty string test=item1

有人知道为什么是这样吗?我无法更改 JSON 结构。

标签: powershell

解决方案


Get-Member查看管道中的第一项(每种不同类型的)以确定要使用的属性集。

Out-GridView和其他 cmdlet 喜欢Export-CSV做同样的事情。

PSCustomObject这与这些是s的事实无关。FileInfo这是一个带有对象的示例:

$files = Get-ChildItem -Path C:\temp -File |
    Select-Object -First 2

#Add a property to second item
$files[1] | Add-Member -MemberType NoteProperty -Name Test -Value 'hello world'

#doesn't show Test, because it wasn't in the first item
$files | Get-Member


$files2 = Get-ChildItem -Path C:\temp -File |
    Select-Object -First 2

#add property to first item
$files2[0] | Add-Member -MemberType NoteProperty -Name Test -Value 'hello world'

#shows Test, because it was in the first item
$files2 | Get-Member

推荐阅读