select-object -expandproperty с нулевым свойством

У меня есть коллекция объектов со свойствами, такими как идентификатор, имя пользователя, адрес электронной почты, 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

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

2 ответа

Решение

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

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                                           

РЕДАКТИРОВАТЬ

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

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

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

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

Чтобы включить входные объекты, которые не имеют identities свойство, поэтому вы должны предоставить имитирующую идентичность заполнителя, что демонстрирует следующий код с использованием идентификатора заполнителя [pscustomobject] @{ provider='none'; extern_uid='none' } через вспомогательный Select-Object вызов, который использует вычисляемое свойство, чтобы обеспечить существование 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 представлен дважды, один раз для каждой идентичности.

Другие вопросы по тегам