如何迭代对象的属性

时间:2017-04-25 15:17:02

标签: powershell

我正在尝试编写一个PowerShell脚本,该脚本遍历对象属性并仅输出值为True的脚本。

我的起始数据是:

UserId                                  : 00546000000m3vCAAQ
UserPermissionsOfflineUser              : True
UserPermissionsMobileUser               : False
UserPermissionsSupportUser              : True
UserPermissionsWebUser                  : False

我希望输出包含UserID,并且只包含如下所示的许可证:

UserId                                  : 00546000000m3vCAAQ
UserPermissionsOfflineUser              : True
UserPermissionsSupportUser              : True

我认为我需要两个循环,一个循环遍历每个用户,然后是另一个循环来迭代用户的属性,并解析出所有错误的值。

foreach ($_ in $resultset)
{
  $_ |
  Select-Object -Property @{ N = 'UserId'; E = { $_.Id } }

  #This is where I am getting stuck on the second loop.
  #$_.psobject.properties | % { $_.Value }      
}

1 个答案:

答案 0 :(得分:2)

使用Where-Object查找值为$true的属性,然后使用Select-Object选择UserID属性:

$resultSet |ForEach-Object {
  $trueProperties = $_.psobject.Properties |Where-Object {$_.Value -eq $true} |Select -ExpandProperty Name
  $_ |Select -Property @('Id';$trueProperties)
}

请注意,根据这些值选择性地挑选属性可能会导致您以后使用Export-*Format-* cmdlet感到痛苦

|Select-Object -ExpandProperty Name部分抓取通过我们的Name过滤器生成的属性的Where-Object属性的值,因此此时$trueProperties包含2个字符串:“ UserPermissionsOfflineUser“和”UserPermissionsSupportUser“。

表达式@('Id';$trueProperties)只是将字符串连接到“Id”字符串,因此最后的Select-Object语句与说法基本相同:

$_ |Select Id,UserPermissionsOfflineUser,UserPermissionsSupportUser