Powershell对比两个对象属性,查找不在AD启用用户列表的邮箱
错误原因
你写的双层循环逻辑存在缺陷:对每个$SubscriberEmail的邮箱,都会逐个和$ADEnabledUsersEmail里的所有邮箱逐一比对,只要当前比对的AD邮箱不匹配就会输出一次该订阅邮箱。假设$ADEnabledUsersEmail里有100个对象,一个不存在于AD的订阅邮箱就会被重复输出100次,即便存在的邮箱也会输出99次重复内容,仅最后一次匹配时输出“User is active”。
修正方案
方案1:哈希集合实现(推荐,大数据量下效率更高)
先把所有AD用户的工作邮箱存入哈希集合,查找复杂度为O(1),自动去重,性能远高于遍历比对:
# 提取所有AD启用用户的工作邮箱存入哈希集合 $adEmailSet = [System.Collections.Generic.HashSet[string]]::new([string[]]$ADEnabledUsersEmail.'Work Email') # 遍历订阅邮箱,输出不在AD集合中的邮箱 foreach ($S in $SubscriberEmail ){ if (-not $adEmailSet.Contains($S.email)) { Write-Host $S.email } }
方案2:简易写法(小数据量适用)
用PowerShell原生的-notin操作符实现,代码更易读:
# 提取所有AD用户的工作邮箱为数组 $adEmailList = $ADEnabledUsersEmail.'Work Email' foreach ($S in $SubscriberEmail ){ if ($S.email -notin $adEmailList) { Write-Host $S.email } }
内容的提问来源于stack exchange,提问作者Miles
相关产品推荐
相关产品推荐

