PowerShell调用Send-MailMessage发邮件时附件空值报错解决方案
解决方案
完全不需要写多分支if枚举所有附件组合,只需要在传入-Attachments参数前,先对附件路径数组做过滤即可。
具体实现
- 先把所有可能用到的附件路径变量统一放到一个数组里,不用提前判断每个变量是否为空
- 过滤掉数组里的
$null、空字符串、空白内容,还可以加一层文件存在性校验,避免路径写错、文件被删除导致的发送报错 - 简单校验过滤后的有效附件数量满足「至少1个」的要求后,直接把过滤后的数组传给
Send-MailMessage的-Attachments参数即可
参考代码
# 收集所有候选附件并过滤无效项 $validAttachments = @( $UsersResultFileName, $NumbersTableFilename, # 要加第3、第4个附件直接往这里追加变量就行,不用改其他逻辑 # $ThirdAttachment, # $FourthAttachment ) | Where-Object { # 同时过滤空值和不存在的文件路径 -not [string]::IsNullOrWhiteSpace($_) -and (Test-Path $_ -PathType Leaf) } # 校验有效附件数量符合最低要求 if ($validAttachments.Count -lt 1) { throw "未找到任何可发送的有效附件,终止流程" } # 执行发送 Send-MailMessage -to $EmailTo -Body $Body -Subject "$TodayDate Report" -Attachments $validAttachments -From 'r-@doman.com' -SmtpServer 'server' -port '25' -BodyAsHtml -ErrorAction Stop
方案优点
- 代码简洁,没有冗余的分支判断
- 扩展性强,后续增减附件只需要修改候选附件列表,不需要调整判断逻辑
- 比单纯判断空值更健壮,能同时拦截路径无效类的报错
内容的提问来源于stack exchange,提问作者dcaz
相关产品推荐
相关产品推荐

