4

我有一组具有 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

我只得到那些具有身份属性的元素。我需要所有实体,有或没有身份属性

4

2 回答 2

6

如果没有太多要处理的属性,您可以使用以下内容:

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

这将返回$null属性providerextern_uid那些没有identities属性的对象:

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

编辑

正如 mklement0 指出的那样,如果 identities 属性包含多个对象,则该方法不起作用。

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

于 2018-12-04T11:35:17.487 回答
4

注意:此答案解决了所提出的问题,但是,根据接受的答案来判断,真正的问题一定是不同的。

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表示两次,每个身份一次。

于 2018-12-04T13:58:28.403 回答