select-object -expand属性 with null 属性
select-object -expandproperty with null property
我有一组对象,这些对象具有 id、用户名、电子邮件、current_sign_in_at、身份等属性。其中 Identities 属性 是具有两个属性的对象数组。这将是对象的 json 表示:
{
"id": 45,
"name": "Emilio Roche",
"username": "EROCHE",
"state": "active",
"identities": [
{
"provider": "ldapmain",
"extern_uid": "cn=roche\, emilio,ou=xxxxxxxxxx"
}
]
}
但列表中的某些元素不具有身份 属性。所以,当我这样做时:
Get-Collection | Select-Object id, username -ExpandProperty identities
我只得到那些具有身份的元素属性。我需要所有实体,有或没有身份 属性
如果没有太多的属性要处理,你可以使用这样的东西:
Get-Collection | Select-Object id,
username,
@{n='provider';e={$_.identities.provider}},
@{n='extern_uid';e={$_.identities.extern_uid}}
这将 return $null
属性 provider
和 extern_uid
对于那些没有 identities
属性 的对象:
id username provider extern_uid
-- -------- -------- ----------
45 EROCHE ldapmain cn=roche\, emilio,ou=xxxxxxxxxx
46 EROCHE
编辑
正如 mklement0 指出的那样,如果身份 属性 拥有多个对象,则该方法不起作用。
mklement0 的答案对这个问题有一个优雅的解决方案,应该是公认的答案。
注意:这个答案解决了 所问的问题 ,但是,根据 判断,真正的问题一定是不同的。
Select-Object -ExpandProperty identities id, username
为 identities
数组 中的每个个体身份 输出一个对象 .
为了包含缺少 identities
属性 的输入对象,您必须为它们提供一个 placeholder 虚拟标识,这是以下代码演示的内容,通过辅助 Select-Object
调用使用占位符标识 [pscustomobject] @{ provider='none'; extern_uid='none' }
,该调用使用 来确保 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
如何表示 两次 ,每个身份一次。
我有一组对象,这些对象具有 id、用户名、电子邮件、current_sign_in_at、身份等属性。其中 Identities 属性 是具有两个属性的对象数组。这将是对象的 json 表示:
{
"id": 45,
"name": "Emilio Roche",
"username": "EROCHE",
"state": "active",
"identities": [
{
"provider": "ldapmain",
"extern_uid": "cn=roche\, emilio,ou=xxxxxxxxxx"
}
]
}
但列表中的某些元素不具有身份 属性。所以,当我这样做时:
Get-Collection | Select-Object id, username -ExpandProperty identities
我只得到那些具有身份的元素属性。我需要所有实体,有或没有身份 属性
如果没有太多的属性要处理,你可以使用这样的东西:
Get-Collection | Select-Object id,
username,
@{n='provider';e={$_.identities.provider}},
@{n='extern_uid';e={$_.identities.extern_uid}}
这将 return $null
属性 provider
和 extern_uid
对于那些没有 identities
属性 的对象:
id username provider extern_uid
-- -------- -------- ----------
45 EROCHE ldapmain cn=roche\, emilio,ou=xxxxxxxxxx
46 EROCHE
编辑
正如 mklement0 指出的那样,如果身份 属性 拥有多个对象,则该方法不起作用。
mklement0 的答案对这个问题有一个优雅的解决方案,应该是公认的答案。
注意:这个答案解决了 所问的问题 ,但是,根据
Select-Object -ExpandProperty identities id, username
为 identities
数组 中的每个个体身份 输出一个对象 .
为了包含缺少 identities
属性 的输入对象,您必须为它们提供一个 placeholder 虚拟标识,这是以下代码演示的内容,通过辅助 Select-Object
调用使用占位符标识 [pscustomobject] @{ provider='none'; extern_uid='none' }
,该调用使用 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
如何表示 两次 ,每个身份一次。