如何比较两个自定义 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
}
}
}
目前我有两个 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
}
}
}