You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:37:42