PowerShell优化大型CSV处理:批量添加AD用户属性至CSV
优化方案:批量AD查询+哈希表快速匹配
核心问题分析
你当前的性能瓶颈集中在三点:
- 嵌套循环的高时间复杂度:遍历30万条CSV记录时,每条都要遍历1800条AD结果,总计算量达5.4亿次,耗时必然过长
- 低效的AD查询方式:逐个调用
Get-ADUser会产生大量AD请求,且-Properties *会返回不必要的属性,增加数据传输开销 - 数组拼接的性能损耗:
$Array += $ResultObject每次都会创建新数组,随着数据量增大,性能急剧下降
优化步骤及代码实现
1. 提取唯一用户ID并批量查询AD属性
直接批量查询所有唯一用户,替代逐个查询,同时只请求需要的属性:
# 导入CSV(注意:如果原CSV已有表头,去掉-Header参数) $originalCsv = Import-Csv -Path "$CSVFilePath/$file" -Delimiter '|' -Header Login,Name,Role,System,Permission # 提取唯一Login(跳过第一行表头如果需要) $uniqueLogins = $originalCsv | Select-Object -Skip 1 -ExpandProperty Login | Get-Unique # 批量查询AD用户,仅获取需要的属性 $adUserMap = @{} Get-ADUser -Filter "SamAccountName -in @($uniqueLogins)" -Server "xxx" -Properties Manager, extensionAttribute7 | ForEach-Object { # 处理经理名称 $managerName = $null if ($_.Manager) { $managerParts = $_.Manager -split ',' $managerName = ($managerParts[0] + ',' + $managerParts[1]) -replace 'CN=', '' } # 构建哈希表:键为Login,值为包含经理和自定义属性的对象 $adUserMap[$_.SamAccountName] = [PSCustomObject]@{ REPORTING_MANAGER = $managerName CUSTOM_COLUMN = $_.extensionAttribute7 } }
2. 遍历原CSV并追加属性
利用哈希表O(1)的查询速度,直接给每条CSV记录追加属性:
# 处理原CSV的每条记录,追加AD属性 $outputCsv = $originalCsv | ForEach-Object { # 跳过表头行(如果原CSV没有表头则去掉这行) if ($_.Login -eq 'Login') { $_ | Add-Member -Name "REPORTING_MANAGER" -Value "REPORTING_MANAGER" -MemberType NoteProperty -Force $_ | Add-Member -Name "CUSTOM_COLUMN" -Value "CUSTOM_COLUMN" -MemberType NoteProperty -Force return $_ } # 从哈希表获取对应属性 $adProps = $adUserMap[$_.Login] $_ | Add-Member -Name "REPORTING_MANAGER" -Value $adProps.REPORTING_MANAGER -MemberType NoteProperty -Force $_ | Add-Member -Name "CUSTOM_COLUMN" -Value $adProps.CUSTOM_COLUMN -MemberType NoteProperty -Force return $_ } # 导出结果到新CSV $outputCsv | Export-Csv -Path "$CSVFilePath/Updated_$file" -Delimiter '|' -NoTypeInformation
关键优化点说明
- 批量AD查询:将1800次AD请求合并为1次,大幅减少网络开销和AD服务器压力
- 哈希表快速匹配:将AD结果存储为哈希表,查询用户属性的时间复杂度从O(n)降为O(1),30万条记录的处理时间从数小时缩短至数分钟
- 避免数组拼接:直接通过
ForEach-Object收集处理后的对象,替代$Array +=的低效操作 - 精准请求属性:去掉
-Properties *,只获取Manager和extensionAttribute7,减少数据传输量
内容的提问来源于stack exchange,提问作者Just Another Developer
相关产品推荐
相关产品推荐

