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 属性 providerextern_uid 对于那些没有 identities 属性 的对象:

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

编辑

正如 mklement0 指出的那样,如果身份 属性 拥有多个对象,则该方法不起作用。

mklement0 的答案对这个问题有一个优雅的解决方案,应该是公认的答案。

注意:这个答案解决了 所问的问题 ,但是,根据 判断,真正的问题一定是不同的。

Select-Object -ExpandProperty identities id, usernameidentities 数组 中的每个个体身份 输出一个对象 .

为了包含缺少 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 如何表示 两次 ,每个身份一次。