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的对象,保证输出行数与输入完全一致。 - 经理信息容错:
- 先判断用户的
Manager属性是否为空,为空直接填充Not Found - 不为空时查询经理AD对象,若查询失败(比如经理账号已删除),仍保持填充
Not Found
- 先判断用户的
- 输出一致性:确保每一行输入都对应一行输出,严格保持原始顺序。
内容的提问来源于stack exchange,提问作者Chris Newton
相关产品推荐
相关产品推荐

