如何比较两个自定义 ps 自定义对象并根据另一个的结果更改一个的值?

How to compare two custom ps custom objects and change the value of one based on the result of another?

目前我有两个 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。我不确定这是否是正确的方法。

您的 Where-Object 子句没有多大意义。它说的是"Where a property of one instance of array B is like the entire array of properties"。 -like 用于比较刺痛。 -包含数组...但这也不会修复您的代码....

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

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

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

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

    $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

            }



        }
    }