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

PowerShell脚本故障优化:AD查询容错与CSV输出一致性需求

修复后的PowerShell脚本(带容错与行对齐)

以下是修改后的脚本,解决了无经理信息时终止的问题,同时保证输出CSV和输入的行数、顺序完全一致,缺失信息自动填充Not Found:

#NOTE: 源文件必须包含名为"email"的列头!
#Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Import-Module ActiveDirectory
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null

# 全局错误行为改为Continue,避免单个错误终止整个脚本
$ErrorActionPreference = 'Continue'

$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.Title = "请选择要处理的CSV文件"
$OpenFileDialog.InitialDirectory = $InitialDirectory
$OpenFileDialog.Filter = "CSV (*.csv) | *.csv"
$OpenFileDialog.ShowDialog() | Out-Null
$Path = $OpenFileDialog.Filename
$userList = Import-Csv -Path $Path

Function Get-FileName($initialDirectory) {   
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null

    $SaveFileDialog = New-Object System.Windows.Forms.SaveFileDialog
    $SaveFileDialog.Title = "选择保存文件的位置"
    $SaveFileDialog.initialDirectory = $initialDirectory
    $SaveFileDialog.filter = "CSV文件 (*.csv)|*.csv|所有文件 (*.*)|*.*";
    $SaveFileDialog.ShowDialog() | Out-Null
    $SaveFileDialog.filename
}
$SavePath = Get-FileName

$adUserParams = @{
    Properties = 'mail', 'samaccountname', 'manager'
    ErrorAction = 'SilentlyContinue'  # 查询AD用户时静默忽略错误
}

# 定义输出对象的模板脚本块
$outputObjectTemplate = {
    param(
        $mail = 'Not Found',
        $samAccountName = 'Not Found',
        $manager = 'Not Found',
        $managerEmail = 'Not Found'
    )

    [pscustomobject]@{
        Mail           = $mail
        SamAccountName = $samAccountName
        Manager        = $manager
        ManagerEmail   = $managerEmail
    }
}

[System.Windows.Forms.MessageBox]::Show('脚本开始运行...','启动脚本')
$userList | ForEach-Object {
    $currentEmail = $_.email

    # 情况1:当前行email为空,直接生成填充后的对象
    if([string]::IsNullOrWhiteSpace($currentEmail)) {
        & $outputObjectTemplate
        return
    }

    # 情况2:查询AD用户
    $adUserParams['Filter'] = "mail -eq '$currentEmail'"
    $adUser = Get-ADUser @adUserParams

    # 子情况2.1:未找到AD用户
    if(-not $adUser) {
        & $outputObjectTemplate -mail $currentEmail
        return
    }

    # 子情况2.2:找到AD用户,处理经理信息
    $managerName = 'Not Found'
    $managerEmail = 'Not Found'
    if(-not [string]::IsNullOrWhiteSpace($adUser.Manager)) {
        $managerAdUser = Get-ADUser -Identity $adUser.Manager -Properties mail -ErrorAction SilentlyContinue
        if($managerAdUser) {
            $managerName = $managerAdUser.Name
            $managerEmail = $managerAdUser.mail ?? 'Not Found'
        }
    }

    # 生成最终输出对象
    & $outputObjectTemplate -mail $adUser.Mail -samAccountName $adUser.SamAccountName -manager $managerName -managerEmail $managerEmail
} | Export-CSV -Path $SavePath -NoTypeInformation -Encoding UTF8

[System.Windows.Forms.MessageBox]::Show('脚本运行完成','完成')

关键修改说明

  • 全局错误控制:将$ErrorActionPreference从Stop改为Continue,同时在Get-ADUser命令上单独设置-ErrorAction SilentlyContinue,避免单个查询错误终止整个脚本。
  • 空email行处理:不再跳过空email的行,而是生成填充Not Found的对象,保证输出行数与输入完全一致。
  • 经理信息容错:
    1. 先判断用户的Manager属性是否为空,为空直接填充Not Found
    2. 不为空时查询经理AD对象,若查询失败(比如经理账号已删除),仍保持填充Not Found
  • 输出一致性:确保每一行输入都对应一行输出,严格保持原始顺序。

内容的提问来源于stack exchange,提问作者Chris Newton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:01:20