You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell:检查9500+项数组元素是否存在于另一数组及脚本修正

PowerShell数组元素对比优化方案

原脚本的核心问题是-notin运算符用错了——它只能判断单个值是否不在目标集合里,直接用数组跟集合对比只会返回一个布尔值,没法筛选出具体的元素。另外考虑到$arrayEmail有9500+项,用数组遍历对比效率很低,换成哈希表查找能大幅提升速度。

修正后的脚本如下:

function MatchUsers {
    # 读取并解析JSON数据
    $array = Get-Content -Raw -Path PassDataOut.json | ConvertFrom-Json
    # 提取邮箱并清理格式,过滤空值
    $arrayEmail = $array.Email | ForEach-Object { $_.Trim() } | Where-Object { $_ }

    # 加载AD模块并查询禁用用户的邮箱
    Import-Module ActiveDirectory
    $empList = Get-ADUser -Filter 'Enabled -eq $false' -SearchBase "OU=domain Users,DC=graytv,DC=corp"
    $empListEmail = $empList.UserPrincipalName

    # 把小集合转成哈希表,提升查找效率
    $empEmailHash = [HashSet[string]]::new($empListEmail, [StringComparer]::OrdinalIgnoreCase)

    # 筛选出不在AD禁用用户列表里的邮箱
    $NotInList = $arrayEmail | Where-Object { -not $empEmailHash.Contains($_) }

    # 输出结果
    Write-Host "不在禁用用户列表中的邮箱数量:$($NotInList.Count)"
    $NotInList
}

关键说明:

  • 哈希表优化:用[HashSet[string]]创建哈希表,指定忽略大小写的比较器(AD的UserPrincipalName通常大小写不敏感),查找速度比数组遍历快几十倍,适配大数量的$arrayEmail。
  • 数据清理:先对$arrayEmail做Trim并过滤空值,避免空字符串或前后空格导致的匹配错误。
  • 正确筛选逻辑:用Where-Object配合哈希表的Contains方法,逐个检查邮箱是否不在AD列表里,最终得到符合要求的数组。

内容的提问来源于stack exchange,提问作者Timothy Waters

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:55:32