具有null属性的select-object -expandproperty

时间:2018-12-04 11:24:33

标签: powershell select-object

我收集了一些具有ID,用户名,电子邮件,current_sign_in_at和identities等属性的对象。 Identities属性是具有两个属性的对象的数组。这将是对象的json表示形式:

{
        "id": 45,
        "name": "Emilio Roche",
        "username": "EROCHE",
        "state": "active",
        "identities": [
            {
                "provider": "ldapmain",
                "extern_uid": "cn=roche\\, emilio,ou=xxxxxxxxxx"
            }    
          ]
    }

但是列表中的某些元素没有identities属性。所以,当我这样做时:

Get-Collection | Select-Object id, username  -ExpandProperty identities

我仅获得具有identities属性的那些元素。我需要所有带有或不带有身份属性的实体

2 个答案:

答案 0 :(得分:5)

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

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的答案可以很好地解决这个问题,应该是公认的答案。

答案 1 :(得分:2)

注意:此答案解决了所问的问题,但是,根据接受的answer来看,实际的问题肯定有所不同。

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

为了包括缺少identities属性的输入对象,因此必须为其提供 placeholder 伪身份,这是下面的代码通过使用calculated property来确保存在[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两次表示一次,每个身份一次。