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

如何用PowerShell将多服务器服务查询结果转为邮件正文表格?

把PowerShell服务查询结果转为邮件正文表格的解决方案

我完全get到你的需求啦——你手头有一段能正常运行的PowerShell脚本,负责分两组服务器分别查询service1和service2,目前是把查询结果追加到文本文件里再作为附件发邮件,现在想把这些结果直接做成美观的表格嵌入到邮件正文中,对吧?

先理下你提供的现有代码片段

$date = Get-Date -format "dd-MMM-yyyy-hh-mm"
$AllTestServers = @("server1.company.com", "server2.company.com", "server3.company.com", "server4.company.com", "server5.company.com", "server6.company.com", "server7.company.com", "server8.company.com", "server9.company.com")
# 这里应该还包含另一组服务器列表,以及查询service1、service2的核心逻辑

实现思路与修改方案

要实现把查询结果转为邮件正文的表格,核心是先收集结构化的查询数据,再转成邮件客户端支持的HTML格式表格,最后发送HTML格式的邮件。下面是具体的修改步骤:

1. 重构查询逻辑,收集结构化结果

先把两组服务器和对应要查询的服务整理成结构化数据,循环查询后把结果存储为自定义对象数组,这样后续转表格会非常方便:

# 定义两组服务器与对应服务的映射关系
$serverServiceMap = @(
    @{ Servers = @("server1.company.com", "server2.company.com", "server3.company.com"); TargetService = "service1" },
    @{ Servers = @("server4.company.com", "server5.company.com", "server6.company.com"); TargetService = "service2" }
)

# 初始化数组存储所有查询结果
$queryResults = @()

# 循环查询每组服务器的服务状态
foreach ($mapItem in $serverServiceMap) {
    foreach ($server in $mapItem.Servers) {
        try {
            # 尝试远程查询服务信息
            $serviceInfo = Get-Service -Name $mapItem.TargetService -ComputerName $server -ErrorAction Stop
            $serviceStatus = $serviceInfo.Status
            $startupType = $serviceInfo.StartType
        }
        catch {
            # 查询失败时记录错误信息
            $serviceStatus = "查询失败:$($_.Exception.Message)"
            $startupType = "N/A"
        }
        # 将结果添加到数组中
        $queryResults += [PSCustomObject]@{
            服务器名称 = $server
            服务名称   = $mapItem.TargetService
            服务状态   = $serviceStatus
            启动类型   = $startupType
            查询时间   = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
        }
    }
}

2. 把结构化结果转为带样式的HTML表格

使用ConvertTo-Html命令把结果转成HTML表格,还可以自定义CSS样式让表格更美观,避免默认样式太简陋:

# 定义HTML表格的样式(可根据需求调整)
$htmlStyle = @"
<style>
    table { border-collapse: collapse; width: 95%; margin: 10px auto; }
    th { background-color: #4CAF50; color: white; padding: 12px; text-align: left; }
    td { border: 1px solid #ddd; padding: 8px; }
    tr:nth-child(even) { background-color: #f2f2f2; }
    tr:hover { background-color: #e8f5e9; }
</style>
"@

# 将查询结果转为HTML表格,拼接样式和标题
$emailBody = $queryResults | ConvertTo-Html -Head $htmlStyle -Title "服务器服务状态查询报告"

3. 发送带HTML正文的邮件

使用Send-MailMessage命令发送邮件时,记得加上-BodyAsHtml参数,让邮件客户端识别HTML格式:

# 邮件基础配置,替换成你实际的参数
$smtpServer = "smtp.yourcompany.com"
$sender = "service-monitor@yourcompany.com"
$recipients = "team-member1@yourcompany.com", "team-member2@yourcompany.com"
$emailSubject = "服务器服务状态查询报告 - $date"

# 发送邮件,同时可保留原附件功能(如果需要的话)
Send-MailMessage -SmtpServer $smtpServer `
    -From $sender `
    -To $recipients `
    -Subject $emailSubject `
    -Body ($emailBody -join "`n") `
    -BodyAsHtml
    # 如果需要保留原文本附件,加上下面这行
    # -Attachments "你的结果文件路径.txt"

几个小提示

  • 确保执行脚本的机器能正常访问目标服务器的WinRM/WMI服务(Get-Service远程查询依赖这些)
  • 可以根据公司邮件风格调整HTML样式,比如修改表头颜色、字体大小等
  • 如果需要对结果进行过滤或排序,在转HTML前对$queryResults数组做处理即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:38:01