如何用PowerShell为CSV文件新增samAccountName列?技术求助
解决CSV新增samAccountName列的问题
你的代码存在几个关键问题:
- 循环内每次输出整个CSV数据集,而非当前处理的单行
- AD用户查询的过滤器变量引用错误,导致无法正确匹配用户
- 使用
Set-Content而非Export-Csv处理CSV输出,格式会出错
以下是修正后的完整代码:
# 导入CSV文件,指定分隔符为分号 $CSVData = Import-Csv 'C:\test.csv' -Delimiter ';' # 遍历每一行数据,查询对应的samAccountName并添加列 $CSVData | ForEach-Object { # 安全构建AD查询过滤器,避免变量注入问题 $filter = "GivenName -eq '$($_.Name)' -and SurName -eq '$($_.Surname)'" # 查询AD用户并获取samAccountName,没有匹配时返回空值 $samAccountName = Get-ADUser -Filter $filter -ErrorAction SilentlyContinue | Select-Object -ExpandProperty SamAccountName # 输出添加新列后的当前行数据 $_ | Select-Object *, @{Name='samAccountName'; Expression={$samAccountName}} } | Export-Csv 'C:\output.csv' -Delimiter ';' -NoTypeInformation
关键说明:
- 使用
ForEach-Object管道处理,确保每行数据单独处理并输出 - 过滤器中用
$($_.Name)正确插入变量值,避免字符串解析错误 - 添加
-ErrorAction SilentlyContinue避免查询不到用户时抛出错误 - 用
Export-Csv替代Set-Content,保证输出标准CSV格式,-NoTypeInformation会去掉PowerShell默认添加的类型信息行 - 如果存在重名用户,可结合邮箱字段优化过滤器,比如:
$filter = "GivenName -eq '$($_.Name)' -and SurName -eq '$($_.Surname)' -and EmailAddress -eq '$($_.EMail)'"
内容的提问来源于stack exchange,提问作者HtHNightwolf
相关产品推荐
相关产品推荐

