select-object -expandproperty с нулевым свойством - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть коллекция объектов со свойствами, такими как id, имя пользователя, адрес электронной почты, current_sign_in_at, идентичности.Свойство Where Identities - это массив объектов с двумя свойствами.Это будет json-представление объекта:

{
        "id": 45,
        "name": "Emilio Roche",
        "username": "EROCHE",
        "state": "active",
        "identities": [
            {
                "provider": "ldapmain",
                "extern_uid": "cn=roche\\, emilio,ou=xxxxxxxxxx"
            }    
          ]
    }

Но некоторые элементы в списке не имеют свойства identity.Итак, когда я делаю:

Get-Collection | Select-Object id, username  -ExpandProperty identities

, я получаю только те элементы со свойством identity.Мне нужны все сущности, со свойством тождеств или без него

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Примечание. Этот ответ отвечает на вопрос в соответствии с вопросом , но, судя по тому, что ответ был принят, реальная проблема должна была быть иной.

Select-Object -ExpandProperty identities id, username выводит объект для каждого индивидуального идентификатора в массиве identities .

В порядкечтобы включить входные объекты, у которых отсутствует свойство identities, необходимо предоставить им заполнитель фиктивный идентификатор для них , что демонстрирует следующий код, используя идентификатор заполнителя [pscustomobject] @{ provider='none'; extern_uid='none' } через вспомогательное *Вызов 1025 *, использующий вычисленное свойство для обеспечения существования свойства identities.

# Sample JSON:
#  * The 1st object has *2* identities,
#  * the 2nd one none.
$json = '[
  {
    "id": 45,
    "name": "Emilio Roche",
    "username": "EROCHE",
    "state": "active",
    "identities": [
      {
          "provider": "ldapmain",
          "extern_uid": "cn=roche\\, emilio,ou=xxxxxxxxxx"
      },    
      {
          "provider": "ad",
          "extern_uid": "cn=roche\\, emilio,ou=yyyyyyyyyy"
      }    
    ]
  },
  {
    "id": 46,
    "name": "A. Non",
    "username": "ANON",
    "state": "dormant"
  }
]'

($json | ConvertFrom-Json) | 
  Select-Object id, username, @{ n='identities'; e={ 
      if ($_.identities) { $_.identities }
      else               { [pscustomobject] @{ provider='none'; extern_uid='none' } } 
    } } |
      Select-Object id, username -ExpandProperty identities 

Выше приведено:

provider extern_uid                      id username
-------- ----------                      -- --------
ldapmain cn=roche\, emilio,ou=xxxxxxxxxx 45 EROCHE
ad       cn=roche\, emilio,ou=yyyyyyyyyy 45 EROCHE
none     none                            46 ANON

Обратите внимание, как EROCHE представляется дважды , один раз для каждой личности.

0 голосов
/ 04 декабря 2018

Если не слишком много свойств для обработки, вы можете использовать что-то вроде этого:

Get-Collection | Select-Object id, 
    username,
    @{n='provider';e={$_.identities.provider}}, 
    @{n='extern_uid';e={$_.identities.extern_uid}}

Это вернет $null в свойствах provider и extern_uid для тех объектов, которыене имеют свойства identities:

id username provider extern_uid                     
-- -------- -------- ----------                     
45 EROCHE   ldapmain cn=roche\, emilio,ou=xxxxxxxxxx
46 EROCHE                                           

EDIT

Как указывал mklement0, этот подход не работает, если свойство identity содержит более одного объекта.

Ответ mklement0 имеет элегантное решение этой проблемы и должен был быть принятым ответом.

...