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
相关产品推荐
相关产品推荐

