我正在编写一个PowerShell脚本,需要检查数组$arrayEmail中的项目是否在数组$empListEmail中,并将这些值扔到另一个数组c中。数组a有9,500+项,数组B没有很多。令人惊讶的是,我还没有看到执行此操作的示例。我在谷歌上搜索了两天。这是我现在拥有的,但是比较根本不像它应该的那样工作。
function MatchUsers {
$array = Get-Content -Raw -Path PassDataOut.json | ConvertFrom-Json
Import-Module ActiveDirectory # Load the Active Directory module
Set-Location AD: # Change into Active Directory
set-location "DC=graytv,DC=corp" # Sets the location to the Gray TV Corporate directory
$empList = Get-ADUser -filter 'Enabled -eq "False"' -searchbase "OU=domain Users,DC=graytv,DC=corp"
$arrayTemp = $array.Email
$arrayEmail = $arrayTemp.trim()
$empListEmail = $empList.UserPrincipalName
$NotInList = @($arrayEmail) -notin $empListEmail
Write-Host $NotInList
如果你不介意在$arrayEmail
中有唯一的电子邮件,这是一个类似于Mathias的回答,但颠倒了HashSet<T>
的顺序,并使用它的.ExceptWith
方法进行过滤。
$arrayEmail = [System.Collections.Generic.HashSet[string]]::new(
[string[]] $array.Email.Trim(),
[StringComparer]::OrdinalIgnoreCase
)
$arrayEmail.ExceptWith([string[]] $empList.UserPrincipalName)
$arrayEmail # => updated to only values not in `$empList.UserPrincipalName`
根据评论的反馈,似乎你在寻找相反的情况,在$empList.UserPrincipalName
中也存在的$array.Email
中找到所有这些元素。在这种情况下,您只需要将方法更改为.IntersectWith
:
$arrayEmail = [System.Collections.Generic.HashSet[string]]::new(
[string[]] $array.Email.Trim(),
[StringComparer]::OrdinalIgnoreCase
)
$arrayEmail.IntersectWith([string[]] $empList.UserPrincipalName)
$arrayEmail # => updated to only values present in `$empList.UserPrincipalName`
当您在google上搜索Compare-Object
时,您可能会得到一个选项,但是使用-notin
操作符也可以。这个问题来自于试图将整个列表与另一个列表进行比较。您必须遍历内容以对照列表进行检查:
$arrayEmail.Where{$_ -notin $empListEmail}
将第二个列表转换为HashSet<string>
-它将比数组搜索快得多:
$empListEmail = [System.Collections.Generic.HashSet[string]]::new([string[]]$empList.UserPrincipalName, [StringComparer]::OrdinalIgnoreCase)
$NotInList = $arrayEmail |Where-Object { -not $empListEmail.Contains($_) }