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
представлен дважды, один раз для каждой идентичности.