PowerShell导入CSV时部分行意外拆分导致AD组查询失败求助
问题根因定位
你遇到的DN异常换行问题核心出在DN列表生成脚本的错误写法,以及读取逻辑没有做异常字符清洗:
- 你生成DN列表时直接用
Out-File -Append拼接字符串,Out-File默认有行宽限制(默认和当前PowerShell窗口宽度一致,通常为80~120字符),长度超过限制的DN会被自动折成两行写入文件,这就是换行符的来源。你手动复制粘贴能正常执行,是因为复制操作会自动忽略文本里的软换行,终端接收粘贴内容时也会自动拼接相邻行,所以不会触发报错。 - 你写的
Get-ADGroup查询语句把-Filter参数和变量$SearchFilter拆成了两行,语法存在隐性错误,也可能导致输出异常。 - 读取DN时没有做特殊字符清洗,直接把带换行/回车符的内容传入AD查询接口,自然会报错。
修复步骤
1 修正DN列表生成脚本,生成标准CSV
直接用PowerShell自带的Export-Csv生成标准格式CSV,避免手动拼接的格式问题,修正后代码如下:
$SearchScope = "OU=OUName,DC=Domain,DC=Domain,DC=com" $SearchFilter = {GroupCategory -eq 'Distribution'} # 修正Filter参数换行问题,一次性查询所有AD组 $Groups = Get-ADGroup -SearchBase $SearchScope -Filter $SearchFilter | Sort-Object Name # 直接导出标准CSV,将DistinguishedName作为Name列输出 $Groups | Select-Object @{Name='Name';Expression={$_.DistinguishedName}} | Export-Csv -Path C:\Temp\DLName.csv -NoTypeInformation -Encoding UTF8
该脚本生成的CSV不会出现自动换行问题,统一UTF8编码也能避免读取时的编码异常。
2 修正查询统计脚本,增加DN清洗逻辑
哪怕旧CSV存在异常,也可以在读取时主动清理所有不可见换行/回车符,同时优化输出逻辑避免循环Append的性能问题:
$Groups = Import-Csv C:\Temp\DLName.csv -Encoding UTF8 Write-Host "总组数量:$($Groups.Count)" $results = foreach ($Group in $Groups) { # 清洗DN,移除所有换行、回车符 $cleanDN = $Group.Name -replace "`r|`n", "" $GroupInfo = Get-ADGroupMembersRecursive -Groups $cleanDN $MembersCount = ($GroupInfo | Measure-Object).Count $FriendlyName = Get-ADGroup -Identity $cleanDN # 输出结构化对象方便后续导出 [PSCustomObject]@{ 组名称 = $FriendlyName.Name 成员数量 = $MembersCount } Write-Host "$($FriendlyName.Name) , $MembersCount" } # 一次性导出结果,避免循环Append导致的格式异常 $results | Export-Csv -Path C:\Temp\DLMembers.csv -NoTypeInformation -Encoding UTF8
额外排查验证手段
如果还有个别DN报错,可以在循环中增加异常捕获,打印原始DN的字符编码确认是否有其他不可见字符:
- 执行
[System.Text.Encoding]::ASCII.GetBytes($Group.Name)输出原始字符的ASCII码,其中换行符ASCII码为10、回车符为13,可以快速定位隐性特殊字符。
内容的提问来源于stack exchange,提问作者typod
相关产品推荐
相关产品推荐

