如何用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
相关产品推荐
相关产品推荐

