Powershell检查一个数组中的item是否在另一个数组中,其中一个数组中有9500个item



我正在编写一个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($_) }

相关内容

  • 没有找到相关文章

最新更新