PowerShell脚本问题:添加PhysicalDeliveryOfficeName并保留空行
问题描述
我有一个包含用户列表的CSV文件,运行PowerShell脚本收集用户的经理姓名、邮箱及PhysicalDeliveryOfficeName并导出至CSV时遇到两个问题:
- 无法将
PhysicalDeliveryOfficeName整合到原有脚本中输出,单独脚本能获取单个用户的该属性,但主脚本不行; - 希望保留输入列表中的空行,使输出CSV也包含对应空行。
相关脚本:
获取单个用户PhysicalDeliveryOfficeName的脚本
$user = "user1" | Get-ADUser -Properties physicaldeliveryofficename | Select-Object -ExpandProperty physicaldeliveryofficename | Sort-Object -Unique
原有脚本
$user = Get-Content 'C:\Temp\List.csv' | get-aduser -properties manager, PhysicalDeliveryOfficeName $managerHash = $user.manager | Sort-Object -Unique | Get-ADUser -Properties emailaddress | Group-Object distinguishedname -AsHashTable $user | Select-Object SamAccountName,PhysicalDeliveryOfficeName @{ n = 'ManagerName'; e = { $managerHash[$PSItem.Manager].Name }}, @{ n = 'ManagerEmailAddress'; e = { $managerHash[$PSItem.Manager].EmailAddress }} | Export-CSV -Path "C:\Temp\List2.csv"
解决方案
1. 修复PhysicalDeliveryOfficeName输出问题
原有脚本的Select-Object语法错误:自定义属性哈希表需要和原生属性放在同一个Select-Object参数列表内,你当前的写法会导致只有最后一个自定义属性生效,前面的SamAccountName和PhysicalDeliveryOfficeName被忽略。同时建议增加经理存在性判断,避免无经理用户触发错误。
修正后的核心代码片段:
$user | Select-Object SamAccountName, PhysicalDeliveryOfficeName, @{ n = 'ManagerName'; e = { if ($PSItem.Manager) { $managerHash[$PSItem.Manager].Name } }}, @{ n = 'ManagerEmailAddress'; e = { if ($PSItem.Manager) { $managerHash[$PSItem.Manager].EmailAddress } }}
2. 保留输入CSV中的空行
Get-Content读取CSV会自动忽略空行,且直接管道给Get-ADUser会跳过空值导致空行丢失。正确做法是用Import-Csv读取原始文件(保留所有行),然后逐行处理:
完整修正脚本(假设输入CSV表头为SamAccountName)
# 读取原始CSV,保留所有行(包括空行) $inputList = Import-Csv -Path 'C:\Temp\List.csv' # 提取有效用户名,排除空行和空白值 $validSamAccounts = $inputList | Where-Object { $_.SamAccountName -and $_.SamAccountName.Trim() } | Select-Object -ExpandProperty SamAccountName # 批量获取AD用户及所需属性 $adUserDetails = $validSamAccounts | Get-ADUser -Properties manager, PhysicalDeliveryOfficeName -ErrorAction SilentlyContinue # 构建经理信息哈希表,提升查询效率 $managerLookup = $adUserDetails.Manager | Where-Object { $_ } | Sort-Object -Unique | Get-ADUser -Properties EmailAddress | Group-Object -Property DistinguishedName -AsHashTable # 逐行处理输入数据,生成输出对象 $outputData = $inputList | ForEach-Object { $currentSam = $_.SamAccountName.Trim() if (-not $currentSam) { # 空行:生成空属性对象 [PSCustomObject]@{ SamAccountName = $null PhysicalDeliveryOfficeName = $null ManagerName = $null ManagerEmailAddress = $null } } else { # 非空行:匹配AD用户信息 $user = $adUserDetails | Where-Object { $_.SamAccountName -eq $currentSam } [PSCustomObject]@{ SamAccountName = $user.SamAccountName PhysicalDeliveryOfficeName = $user.PhysicalDeliveryOfficeName ManagerName = if ($user.Manager) { $managerLookup[$user.Manager].Name } else { $null } ManagerEmailAddress = if ($user.Manager) { $managerLookup[$user.Manager].EmailAddress } else { $null } } } } # 导出结果到CSV $outputData | Export-Csv -Path 'C:\Temp\List2.csv' -NoTypeInformation -Encoding UTF8
关键说明
- 用
Import-Csv读取原始文件,确保空行不被丢弃; - 单独处理空行,生成对应空属性的输出对象;
- 批量获取AD信息+哈希表查询,提升脚本执行效率;
- 增加空值判断,避免无经理或无效用户触发报错。
内容的提问来源于stack exchange,提问作者Ken Robertson
相关产品推荐
相关产品推荐

