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

PowerShell发送VM快照表格至邮件正文时数据缺失如何解决

故障原因
  1. 原查询命令存在语法缺陷:Get-VM 后直接拼接自定义计算属性属于错误写法,缺少Select-Object声明要返回的字段,输出的对象结构本身不符合预期;且时间戳字段未做排序、取最新值处理,多快照场景下会返回数组类型值,无法被正常渲染为单元格文本。
  2. 内容格式不兼容:PowerShell控制台输出的表格是适配终端的纯文本/富文本格式,直接拼接进HTML邮件正文时,未转换为标准HTML表格结构,多数邮件客户端会过滤掉非标准的格式内容,最终只保留空表格框架。
修复方案
  • 第一步:修正快照查询命令,确保输出结构为规整的单值属性集合,将查询结果存入变量备用:
# 查询所有虚拟机的快照统计信息,如需指定单台VM可在Get-VM后加-Name参数
$snapshotReport = Get-VM | Select-Object `
    Name,
    @{Name="TotalSnapshots";Expression={(Get-VMSnapshot -VM $_ | Measure-Object).Count}},
    @{Name="TimeStamp";Expression={(Get-VMSnapshot -VM $_ | Sort-Object CreationTime -Descending | Select-Object -First 1 -ExpandProperty CreationTime)}}
  • 第二步:将查询结果转换为邮件客户端兼容的标准HTML表格,不要直接使用控制台输出的表格内容:
# 生成带基础样式的HTML表格片段,避免被邮件客户端判定为无效内容过滤
$htmlContent = $snapshotReport | ConvertTo-Html `
    -Fragment `
    -Property Name,TotalSnapshots,TimeStamp `
    -PreContent '<p>虚拟机快照统计结果:</p>' `
    -Head '<style>table{border-collapse:collapse;}th,td{border:1px solid #333;padding:6px 10px;}th{background:#f5f5f5;}</style>'
# 组装完整HTML正文
$mailBody = @"
<!DOCTYPE html>
<html>
<body>
$htmlContent
</body>
</html>
"@
  • 第三步:发送邮件时必须声明正文格式为HTML,也就是加上*-BodyAsHtml*参数,否则客户端会按纯文本渲染所有标签:
# 替换为你实际的邮箱、SMTP配置信息
Send-MailMessage `
    -From "ops@example.com" `
    -To "admin@example.com" `
    -Subject "虚拟机快照定期统计" `
    -Body $mailBody `
    -BodyAsHtml `
    -SmtpServer "smtp.example.com" `
    -Port 25
额外排查点

如果按上述步骤调整后仍存在空单元格问题:

  • 检查SMTP网关、发件插件是否存在HTML内容过滤规则,部分安全组件会剥离未做转义的动态内容
  • 确认运行脚本的账号有权限读取对应虚拟机的快照属性,权限不足时字段会返回空值,可先在本地执行$snapshotReport | Format-List确认所有字段是否有正常返回值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 22:31:00