【问题标题】:How to compare two custom ps custom objects and change the value of one based on the result of another?如何比较两个自定义 ps 自定义对象并根据另一个结果更改一个的值?
【发布时间】:2020-06-05 00:13:17
【问题描述】:

目前我有两个输出以下列的 sql 查询

$A | Select-Object -Property DatabaseUserName, Role, PermissionType, PermissionState, ObjectType, ObjectName, col

$B | Select-Object -Property DatabaseUserName, sysadmin

我想在伪代码中执行的操作:WHERE $B.DatabaseUserName = $A.DatabaseUserName THEN $A.col = $B.sysadmin。目前我通过以下方式设置它:

$allUsers = $A | % {
        New-Object psobject -Property @{
            DatabaseUserName = $_.DatabaseUserName
            Role = $_.Role
            PermissionType = $_.PermissionType
            PermissionState = $_.PermissionState
            ObjectType = $_.ObjectType
            ObjectName = $_.ObjectName
            col = 0
        }
    }

    $allUsers += $B | Where-Object {$_.DatabaseUserName -like $B.DatabaseUserName} | % {
        New-Object psobject -Property @{
            $_.col = $B.sysadmin

        }
    }

当我希望它们实际上是 $B.sysadmin 的值时,这仍然使所有列都为 0。我不确定这是否是正确的方法。

【问题讨论】:

    标签: powershell object psobject


    【解决方案1】:

    您的 Where-Object 子句没有多大意义。它说的是“数组 B 的一个实例的属性就像整个属性数组一样”。 -like 用于比较stings。 - 包含数组...但这也不能修复您的代码....

    如果我理解您在伪代码中的要求,您希望在DatabaseUserName 属性匹配时将$B 的属性分配给$A 的不同属性。但是,您发布的代码为$A 中的每个元素分配了一个对象$allusers。我将假设您要更新 $allusers 数组中的对象,而不是直接更新 $A 中的对象。为此,请尝试以下操作:

    Foreach ($au in $allusers) {
        $au.col = ($B | ? {$_.DatabaseUserName -eq $au.DatabaseUserName}).col
    }
    

    上面的代码循环遍历$allusers中的每一项并设置.col属性。请注意,此代码仅在您有一个且只有一个符合您条件的 $B 实例时才有效。如果你有 0,.col 可以等于 $null 或空白。如果您有多个符合条件,那么您的 .col 值将是一个数组。

    【讨论】:

    • 这看起来是一个好的开始。所以返回值是服务器上每个数据库中的用户。这意味着他们可能在 DatabaseUserName 中拥有多个用户,但即使对于重复的用户,我仍然希望有一个 1。当我进行更改并运行它时,它们在 col 中没有输出(使用 $allUsers | Out-GridView)
    • 检查以确保 $B.Col 的元素具有您期望的值。然后将赋值语句 $au.col = 更改为 Write-Host 并查看它在循环中找到了什么。
    【解决方案2】:

    我通过为每个这样的嵌套来解决这个问题

        $AllUsers = $svrInfo | % {
            New-Object psobject -Property @{
                DatabaseUserName = $_.DatabaseUserName
                Role = $_.Role
                PermissionType = $_.PermissionType
                PermissionState = $_.PermissionState
                ObjectType = $_.ObjectType
                ObjectName = $_.ObjectName
                col = 0
    
    
            }
        }
        foreach ($admin in $sysAdmin)
        {
            foreach ($User in $AllUsers)
            {   
                if($User.DatabaseUserName -contains $admin.DatabaseUserName)
                {
                    Write-Host("$User.DatabaseUserName matches $admin.DatabaseUserName")        
                    $User.col = 1
    
                }
    
    
    
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多