使用多个psobject时,Get-Member不返回NoteProperty

时间:2018-06-26 13:48:51

标签: powershell

由于我要处理的某些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结构。

1 个答案:

答案 0 :(得分:3)

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

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

这些是PSCustomObject,与事实无关。这是一个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