PowerShell从含samAccountName的文本导出AD用户属性至CSV仅存最后一条的问题
解决PowerShell导出AD用户到CSV仅保留最后一条记录的问题
问题原因
你的代码存在三个关键问题:
- 循环内重复覆盖文件:每次
ForEach-Object循环调用Export-Csv时,默认会覆盖已有文件,最终只保留最后一次写入的用户数据。 - 变量引用错误:循环内使用未定义的
$User变量,正确的当前对象引用应该是$_。 - 不必要的全属性获取:
Properties *会加载AD用户的所有属性,既浪费资源又拖慢执行速度,只需指定需要的额外属性即可。
正确解决方案
方案一:先收集所有用户数据再统一导出(推荐)
这种方式效率更高,避免频繁的文件IO操作:
# 读取用户ID列表,批量获取所需AD用户属性,最后统一导出到CSV $userList = Get-Content "C:\IDs.txt" | ForEach-Object { Get-ADUser -Identity $_ -Properties Description, Title | Select-Object Name, SamAccountName, Description, Title, DistinguishedName, Enabled } $userList | Export-Csv "C:\UserInfo.csv" -NoTypeInformation
方案二:使用-Append参数追加写入
如果需要边获取边写入,可添加-Append参数,但需先清理已有文件避免重复表头:
# 先删除已有文件,防止重复写入表头 if (Test-Path "C:\UserInfo.csv") { Remove-Item "C:\UserInfo.csv" } Get-Content "C:\IDs.txt" | ForEach-Object { Get-ADUser -Identity $_ -Properties Description, Title | Select-Object Name, SamAccountName, Description, Title, DistinguishedName, Enabled | Export-Csv "C:\UserInfo.csv" -NoTypeInformation -Append }
关键说明
- 只指定需要的额外属性:
Name、SamAccountName、DistinguishedName、Enabled是AD用户的默认属性,无需在-Properties中指定;Description和Title需要显式声明。 - 循环内必须用
$_引用当前处理的用户ID,否则会因变量未定义导致错误。
内容的提问来源于stack exchange,提问作者JCR
相关产品推荐
相关产品推荐

