我有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,DC=com" |
Where-Object { $_.DistinguishedName -notlike '*OU=Disabled,*' } |
select-object ObjectGUID, Name
$obj | ForEach-Object {
if ($i -in $obj.ObjectGUID -eq $j -in $obj1.ObjectsGUID) {
}
}
我应该具有与输出相同的objectGUID。
答案 0 :(得分:0)
执行此操作时...
$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
执行线性搜索。一种简单的解决方案是使用Hashtable
或Dictionary
通过用户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 }