Как сравнить два пользовательских объекта PS и изменить значение одного на основе результата другого? - PullRequest
0 голосов
/ 20 февраля 2020

В настоящее время у меня есть два sql запроса, которые я выводил в следующие столбцы

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

AND

$B | Select-Object -Property DatabaseUserName, sysadmin

Что я хочу сделать в коде psuedo: 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

        }
    }

Это все равно оставляет все столбцы равными 0 по сравнению с тем, что я вижу, когда хочу, чтобы они фактически имели значение $ B.sysadmin. Я не уверен, что это правильный подход.

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Ваше предложение Where-Object не имеет особого смысла. Он говорит: «Где свойство одного экземпляра массива B похоже на весь массив свойств». -подобный используется для сравнения укусов. -содержит для массивов ... но это также не исправит ваш код ....

Если я понимаю, что вы спрашиваете в своем псевдокоде, вы хотите присвоить свойству $B для другое свойство $A, когда свойство DatabaseUserName совпадает. Однако код, который вы опубликовали, присваивает объект $allusers каждому элементу в $A. Я предполагаю, что вы хотите обновить объекты в массиве $allusers, а не в $A напрямую. Для этого попробуйте следующее:

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

Приведенный выше код просматривает каждый элемент в $allusers и устанавливает свойство .col. Обратите внимание, этот код работает, только если у вас есть один и только один экземпляр $B, который соответствует вашим критериям. Если у вас 0, .col может быть равно $null или пусто. Если у вас есть более одного, который соответствует критериям, тогда ваше значение .col будет массивом.

0 голосов
/ 20 февраля 2020

Я понял это, выполнив вложенность для каждого, например,

    $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

            }



        }
    }
...