【问题标题】:How to iterate over the properties of an object如何迭代对象的属性
【发布时间】:2017-04-25 15:17:02
【问题描述】:

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

我的起始数据是这样的:

用户ID:00546000000m3vCAAQ UserPermissionsOfflineUser : 真 用户权限移动用户:假 用户权限支持用户:真 UserPermissionsWebUser:假

我希望输出包含用户 ID 和只有如下的真实许可证:

用户ID:00546000000m3vCAAQ UserPermissionsOfflineUser : 真 用户权限支持用户:真

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

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

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

【问题讨论】:

    标签: powershell


    【解决方案1】:

    使用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 部分获取通过我们的Where-Object 过滤器的属性的Name 属性的值,因此此时$trueProperties 包含2 个字符串:“UserPermissionsOfflineUser”和“UserPermissionsSupportUser”。

    表达式@('Id';$trueProperties) 只是简单地将字符串连接到“Id”字符串,所以最后一个Select-Object 语句基本上相当于说:

    $_ |Select Id,UserPermissionsOfflineUser,UserPermissionsSupportUser
    

    【讨论】:

    • 谢谢。我修复了语法错误。我使用 $_.value 而不是 Value。我现在得到了正确的输出,但是 UserId 是空白的。
    • @PKonstant 是 UserId 属性的实际名称?还是Id?从问题中不清楚
    • 这是“身份证”。我改变了它,它工作!谢谢你。我理解你的部分脚本,直到'|选择 -ExpandProperty Name' 和 '$_ |Select -Property @('Id';$trueProperties)' 。我是 powershell 新手,想知道什么语句输出什么?
    • @PKonstant 添加了更多解释
    • 只是跟进。为什么 $true 不是变量;它有一个 $?。非常感谢您的帮助和时间。
    猜你喜欢
    • 2022-07-14
    • 2023-03-24
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    相关资源
    最近更新 更多