Добавление членов в переменную PSCustomObject - понимание того, что происходит - PullRequest
2 голосов
/ 17 января 2020

Я пытаюсь разобраться, что здесь происходит, и мне было интересно, знает ли кто-нибудь о ресурсе, который мог бы указать мне правильное направление, или мог бы объяснить это немного для меня.

Я пытаюсь создать переменную PSCustomObject, а затем ее члены, например:

$myObject += [PSCustomObject]@{
    FirstName = 'Bill'
    LastName = 'Bobbins'
    Age    = '30'
}

$myObject += [PSCustomObject]@{
    FirstName = 'Ben'
    LastName = 'Bobbins'
    Age    = '40'
}

Итак, первый бит кода выполняется нормально, но второй бит приводит к ошибке «Не удалось вызвать метод, поскольку [System.Management.Automation.PSObject] не содержит метод с именем« op_Addition ».» Кроме того, если я направлю $ myObject в get-member, я вижу, что $ myObject имеет тип TypeName: System.Management.Automation.PSCustomObject.

Теперь, если я сначала установлю $ myObject как пустой массив, и затем попробуйте добавить участников, я успешен. Этот код работает без ошибок:

$myObject=@()

$myObject += [PSCustomObject]@{
    FirstName = 'Bill'
    LastName = 'Bobbins'
    Age    = '30'
}

$myObject += [PSCustomObject]@{
    FirstName = 'Ben'
    LastName = 'Bobbins'
    Age    = '40'
}

Если я теперь направлю $ myObject в get-member, я все равно получу TypeName: System.Management.Automation.PSCustomObject. Итак, мой вопрос: почему мне разрешено добавлять несколько членов в $ myObject во втором примере, а не в первом, когда тип данных одинаков для обоих примеров?

Любая помощь очень ценится!

Спасибо

1 Ответ

2 голосов
/ 18 января 2020

Проблема здесь заключается в том, как Get-Member / работает конвейер - он споткнул меня раньше!

Это развернет массив и даст вам тип каждый элемент как он передает его по конвейеру:

$myObject | Get-Member

Это пропустит весь объект и правильно даст вам тип: System.Object[]

 Get-Member -InputObject $myObject

Вы можете проверьте это, например, добавив $myObject += "test string" в конец вашего кода и попытавшись получить членов в обоих направлениях. Первая вернет типы PSObject и String.

Sidepoint: можно избежать строки $myObject = @(), указав, что вы создаете массив при первом объявлении $myObject. Пример:

[array]$myObject = [PSCustomObject]@{

[PSCustomObject[]]$myObject = [PSCustomObject]@{
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...