编写脚本实现CSV与AD中PC名称双向比对并导出不匹配项
CSV与AD计算机名称双向比对脚本解决方案
问题分析
你之前用like/notlike出现结果异常,核心原因是模糊匹配易产生误判,且没统一AD与CSV中计算机名的格式(AD默认计算机名带$后缀,CSV通常不带)。改用精确匹配的-in/-notin并统一名称格式,就能得到准确结果。
完整脚本示例
# 1. 读取CSV数据源,替换为你的CSV路径与列名(假设列名为ComputerName) $csvComputers = (Import-Csv -Path "C:\Assets\source_devices.csv").ComputerName | Where-Object { $_ -ne $null } # 2. 获取AD中的计算机名,统一格式:去掉默认的$后缀(若CSV带$则删除此行的TrimEnd操作) $adComputers = (Get-ADComputer -Filter *).Name | ForEach-Object { $_.TrimEnd('$') } | Where-Object { $_ -ne $null } # 3. 提取两类不匹配结果 # CSV中有但AD中无匹配的设备 $csvOnly = $csvComputers | Where-Object { $_ -notin $adComputers } | ForEach-Object { [PSCustomObject]@{ ComputerName = $_ MismatchType = "仅存在于CSV(AD无匹配)" } } # AD中有但CSV中无匹配的设备 $adOnly = $adComputers | Where-Object { $_ -notin $csvComputers } | ForEach-Object { [PSCustomObject]@{ ComputerName = $_ MismatchType = "仅存在于AD(CSV无匹配)" } } # 4. 合并结果导出到CSV,替换为你的输出路径 $csvOnly + $adOnly | Export-Csv -Path "C:\Assets\mismatch_results.csv" -NoTypeInformation -Encoding UTF8
关键注意事项
- 列名匹配:确认CSV中的计算机名列名,若不是
ComputerName,需替换脚本中对应的字段。 - 格式统一:如果你的CSV中计算机名本身带
$后缀,删除$_.TrimEnd('$')这部分代码,直接使用AD原始名称。 - 性能优化:若AD规模大,给
Get-ADComputer加-SearchBase参数指定目标OU,减少查询范围:Get-ADComputer -Filter * -SearchBase "OU=Computers,DC=domain,DC=com"
内容的提问来源于stack exchange,提问作者Remi
相关产品推荐
相关产品推荐

