Get-Member не возвращает NoteProperty при использовании нескольких псевдообъектов - PullRequest
0 голосов
/ 26 июня 2018

Это странное поведение, которое я обнаружил из-за структуры некоторого 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 голосов
/ 26 июня 2018

Get-Member просматривает первый элемент (каждого отдельного типа) в конвейере, чтобы определить набор свойств для использования.

Out-GridView и другие командлеты, такие как Export-CSV, делают то же самое.

Это не имеет ничего общего с тем фактом, что это 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...