比较两个二维数组的最佳方法

我有2个域,我将几天内处于非活动状态的ADuser接收,并将两个ADuser都存储在2个不同的数组中并进行比较。 但是我无法比较两个数组,有人可以帮助我吗。

$obj =@()
$obj = Get-ADUser -Filter {LastLogonTimeStamp -lt $time -and enabled -eq 
 $true} -Properties LastLogonTimeStamp -SearchBase "OU=active,DC=adtest,DC=com" | 
Where-Object { $_.DistinguishedName -notlike '*OU=Disabled,*' } | select-object ObjectGUID,Name

$obj1 = @()
$obj1 = Get-ADUser -Filter {LastLogonTimeStamp -lt $time -and enabled -eq $true} -Properties LastLogonTimeStamp -SearchBase "OU=active,DC=adxyz,*' } |
select-object ObjectGUID,Name
$obj | ForEach-Object { 
    if ($i -in $obj.ObjectGUID -eq $j -in $obj1.ObjectsGUID) {
         }
}

我应该具有与输出相同的objectGUID。

gzabocom 回答:比较两个二维数组的最佳方法

执行此操作时...

$obj | ForEach-Object { 
    if ($i -in $obj.ObjectGUID -eq $j -in $obj1.ObjectsGUID) {
    }
}

...您正在遍历$obj的每个元素。 -in运算符还将迭代其第二个操作数,因此您无需再次为$obj使用它。 $i$j在任何地方都没有定义,因此无法使用。但是,您可以使用automatic variable $_来访问$obj ...

中的当前管道元素
$obj | ForEach-Object { 
    if ($_.ObjectGUID -in $obj1.ObjectGUID) {
        $obj
    }
}

这会将$obj属性与ObjectGUID中的元素相匹配的$obj1的所有元素输出到管道。更简单的方法是使用Where-Object cmdlet ...

$obj | Where-Object { $_.ObjectGUID -in $obj1.ObjectGUID }

...或者,对于PowerShell 3.0及更高版本...

$obj | Where-Object -Property 'ObjectGUID' -In -Value $obj1.ObjectGUID

...可以简单地写为...

$obj | Where-Object ObjectGUID -in $obj1.ObjectGUID

但是,这些方法都不是非常有效的,因为对于$obj中的每个元素,-in运算符将通过$obj1执行线性搜索。一种简单的解决方案是使用HashtableDictionary通过用户ObjectGUID查找用户。我们可以使用Group-Object cmdlet来检索这样的Hashtable ...

$adxyzActiveUsersByObjectGUID = $obj1 | Group-Object -Property 'ObjectGUID' -AsHashTable

$adxyzActiveUsersByObjectGUID包含$obj1个用户对象,这些对象在其ObjectGUID属性上建立索引/关键字以便快速检索。然后可以使用Contains() method ...

进行过滤
$obj | Where-Object { $adxyzActiveUsersByObjectGUID.Contains($_.ObjectGUID) }

...或item indexer ...

$obj | Where-Object { $adxyzActiveUsersByObjectGUID[$_.ObjectGUID] -ne $null }
本文链接:https://www.f2er.com/3162060.html

大家都在问