如何使用PowerShell检查CSV列空行并处理Exchange Mailboxes数据
故障原因
- 空行判断逻辑不严谨:原代码用
IsNullOrEmpty只能识别完全为空的字段,CSV中空行如果携带不可见的空格、换行符、制表符,会被误判为非空行,后续执行邮箱提取、EXO查询时直接报错。 - 邮箱提取逻辑无容错:原代码直接取Split后的索引位1的值,如果字段格式存在偏差(比如括号前后多空格、格式不符合预期),会拿到空值或者无效字符串,传入查询命令后触发异常。
- EXO查询无空值校验:如果查询不到匹配的邮箱,
$exoUser会返回空值,直接读取.DisplayName、.Identity属性会触发空引用错误,中断整个循环。 - 无结果存储逻辑:原代码只是循环内给变量赋值,没有把每行的处理结果留存,循环结束后只能拿到最后一行的处理值,拿不到全量结果。
修正后代码
# 导入目标CSV文件 $importFile = Import-Csv -Path "C:\AuditLogSearch\Dis\Modified-Audit-Log-Records.csv" $processResult = @() foreach ($line in $importFile){ # 覆盖空值、全空白字符的空行场景 if([string]::IsNullOrWhiteSpace($line.'Exchange Mailboxes')){ $userName = "" $userId = "" $parsedMail = "" }else{ # 提取括号内的邮箱地址并清除前后多余空格 $parsedMail = $line.'Exchange Mailboxes'.Split([char[]]@('[', ']'))[1].Trim() # 校验提取内容是否符合邮箱格式,避免无效查询 if (-not [string]::IsNullOrWhiteSpace($parsedMail) -and $parsedMail -match '^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$') { try { # 执行EXO邮箱查询,错误触发时进入catch逻辑 $exoUser = Get-EXOMailbox -Filter "PrimarySmtpAddress -eq '$parsedMail'" -ErrorAction Stop if ($null -ne $exoUser) { $userName = $exoUser.DisplayName $userId = $exoUser.Identity } else { $userName = "" $userId = "" } } catch { # 查询异常时兜底赋值空,避免循环中断 $userName = "" $userId = "" Write-Warning "邮箱 $parsedMail 查询失败:$($_.Exception.Message)" } } else { # 字段格式不符合预期时兜底赋值空 $userName = "" $userId = "" } } # 拼接当前行处理结果存入结果集 $processResult += [PSCustomObject]@{ OriginalFieldValue = $line.'Exchange Mailboxes' ParsedEmail = $parsedMail EXO_DisplayName = $userName EXO_Identity = $userId } } # 如需导出处理结果,取消下方注释修改输出路径即可 # $processResult | Export-Csv -Path "C:\AuditLogSearch\Dis\Processed-Mailbox-Records.csv" -NoTypeInformation -Encoding UTF8
关键调整说明
- 空行判断改用
IsNullOrWhiteSpace,覆盖所有空行、带不可见空白字符的无效行场景。 - 提取邮箱后增加空格清理、格式校验,从源头拦截无效查询参数。
- 给EXO查询增加try/catch异常捕获、返回值非空判断,查询失败、无匹配结果时不会中断脚本,自动给变量赋值空字符串。
- 新增结果集存储逻辑,所有行的处理结果会统一存入数组,支持直接调用或导出为新CSV文件。
内容的提问来源于stack exchange,提问作者aasenomad
相关产品推荐
相关产品推荐

