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

PowerShell脚本问题:添加PhysicalDeliveryOfficeName并保留空行

问题描述

我有一个包含用户列表的CSV文件,运行PowerShell脚本收集用户的经理姓名、邮箱及PhysicalDeliveryOfficeName并导出至CSV时遇到两个问题:

  1. 无法将PhysicalDeliveryOfficeName整合到原有脚本中输出,单独脚本能获取单个用户的该属性,但主脚本不行;
  2. 希望保留输入列表中的空行,使输出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:50:27