如何匹配两个CSV的Manager与DistinguishedName字段并导出合并CSV
问题核心原因
你的脚本存在5个核心错误:
- 路径写法错误:
C:temp\AD.csv缺少反斜杠,会导致无法正确读取CSV1文件 - 导入制表符分隔的CSV时未指定分隔符,默认逗号分隔会导致导入的表结构完全错乱
- 遍历逻辑搞反,你需要处理的主体是CSV1的员工记录,而非CSV2的全量用户记录
- CSV2本身没有
Manager列,原匹配条件$_.manager -eq $record.manager永远无法命中 - 没有从
DistinguishedName字段中提取CN值做匹配
修正后脚本
# 1. 导入制表符分隔的两个CSV文件 $csv1 = Import-Csv -Path 'C:\temp\AD.csv' -Delimiter "`t" $csv2 = Import-Csv -Path 'C:\temp\AD_ExportDN.csv' -Delimiter "`t" # 2. 提前构造CSV2的映射表,提升匹配效率:key是DN提取的CN姓名,value是用户全量信息 $userMap = @{} foreach ($user in $csv2) { # 用正则提取DistinguishedName中第一个CN=后的姓名(到第一个逗号截止) if ($user.DistinguishedName -match '^CN=(?<Name>.*?),') { $cnName = $matches.Name $userMap[$cnName] = $user } } # 3. 遍历CSV1的员工记录,匹配对应信息 $output = foreach ($emp in $csv1) { # 先匹配当前员工自己的信息,获取SAM、mail $empSelfInfo = $userMap[$emp.DisplayName] # 再校验经理是否存在于CSV2中(满足你要求的匹配筛选条件) $managerExists = $userMap.ContainsKey($emp.Manager) # 仅输出员工自身信息存在、且经理在CSV2中存在匹配的记录 if ($empSelfInfo -and $managerExists) { [PSCustomObject]@{ SAMAccountName = $empSelfInfo.SAMAccountName mail = $empSelfInfo.mail Manager = $emp.Manager # 如果需要输出经理的DN而非姓名,把上面一行替换为: # Manager = $userMap[$emp.Manager].DistinguishedName } } } # 4. 导出结果,需要制表符分隔的话加 -Delimiter "`t" 即可 $output | Export-Csv -Path 'C:\temp\merged_for_AD2.csv' -NoTypeInformation -Force -Encoding UTF8
脚本说明
- 正则
^CN=(?<Name>.*?),专门适配AD的DistinguishedName格式,准确提取第一个CN节点的姓名 - 用哈希表
$userMap做缓存,避免每次匹配都遍历全量CSV2,数据量越大效率优势越明显 - 输出字段完全匹配你要求的格式,如果需要调整Manager的输出值(比如改为经理的DN),直接修改对应注释行即可
- 导出时指定UTF8编码避免中文乱码,如果不需要制表符分隔导出可以去掉
-Delimiter "t"`参数
内容的提问来源于stack exchange,提问作者denprash
相关产品推荐
相关产品推荐

