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

如何将Powershell多段SQL监控结果整合至单封邮件正文发送

解决方案

核心原理

你之前用Format-Table得到的是格式化显示对象,不是可直接拼接的纯文本,只需要用Out-String把四个结果转成保留格式的纯文本,拼接后直接作为邮件正文发送即可,无需先写入文件再读取。

完整修改后脚本

$DestInstance = "servername"
$DestDatabase = "master"
$smtpServer = "forwarder.mail.xerox.com"
$supportContact = "Andleeb.Hasan@xerox.com"

# 1. 查询SQL服务状态
$O1  = Get-WmiObject -Class Win32_Service -ComputerName $DestInstance | Where-Object {$_.Displayname -in "SQL Server (MSSQLSERVER)","SQL Server Agent (MSSQLSERVER)"} | Format-Table -Property Displayname, state -AutoSize

# 2. 查询磁盘状态
$O2= Get-WmiObject -Class Win32_logicaldisk -Filter "DriveType = '3'" | 
Select-Object -Property DeviceID, VolumeName,
@{L="Capacity";E={"{0:N2}" -f ($_.Size/1GB)}}, 
@{L='FreeSpaceGB';E={"{0:N2}" -f ($_.FreeSpace /1GB)}},
@{L='FreeSpacePerCent';E={"{0:N2}" -f (100*$_.FreeSpace /$_.size)}}|Format-table -Autosize

# 3. 查询数据库状态
$O3= Invoke-Sqlcmd -Database $DestDatabase -ServerInstance "$DestInstance" -Query "SELECT name as Database_Name, state_desc as Database_Status
FROM   sys.databases where name in ('Core01_Prod',
'EquipmentCatalogue',
'iL_Exposure_PRODUCTION',
'iL_Exposure_STAGING',
'LookUpTables',
'ReportServer',
'ReportServerTempDB'
) order by name" |Format-table -Autosize

# 4. 查询作业运行状态
$O4= Invoke-Sqlcmd -Database $DestDatabase -ServerInstance "$DestInstance" -Query ";WITH CTE_MostRecentJobRun AS 
 ( 
 -- For each job get the most recent run (this will be the one where Rnk=1) 
 SELECT job_id,run_status,run_date,run_time 
 ,RANK() OVER (PARTITION BY job_id ORDER BY run_date DESC,run_time DESC) AS Rnk 
 FROM MSDB.dbo.sysjobhistory 
 WHERE step_id=0 
 ) 
SELECT  
  name  AS [Job Name]
 ,CONVERT(VARCHAR,DATEADD(S,(run_time/10000)*60*60 /* hours */ 
  +((run_time - (run_time/10000) * 10000)/100) * 60 /* mins */ 
  + (run_time - (run_time/100) * 100)  /* secs */, 
  CONVERT(DATETIME,RTRIM(run_date),113)),100) AS [Last Run]
 ,CASE WHEN enabled=1 THEN 'Enabled' 
     ELSE 'Disabled' 
  END [Job Status]
FROM     CTE_MostRecentJobRun MRJR 
JOIN     MSDB.dbo.sysjobs SJ 
ON       MRJR.job_id=sj.job_id 
WHERE    Rnk=1 
AND      run_status=1 -- 
ORDER BY [Last Run] desc " | Format-table -Autosize

# ====== 新增:结果拼接+发送邮件 ======
# 把所有格式化结果转成纯文本,保留表格对齐格式
$svcText = $O1 | Out-String
$diskText = $O2 | Out-String
$dbText = $O3 | Out-String
$jobText = $O4 | Out-String

# 拼接邮件正文
$mailBody = @"
=== SQL Server 巡检报告 $(Get-Date -Format 'yyyy年MM月dd日 HH:mm') ===
服务器名称:$DestInstance

---
### 1. SQL核心服务运行状态
$svcText

---
### 2. 服务器磁盘使用状态
$diskText

---
### 3. 业务数据库状态
$dbText

---
### 4. 最近成功运行作业列表
$jobText
"@

# 发送邮件
Send-MailMessage -From "SQL巡检告警<sql-monitor@xerox.com>" `
-To $supportContact `
-Subject "巡检报告:$DestInstance 运行状态 $(Get-Date -Format 'yyyy-MM-dd')" `
-Body $mailBody `
-Encoding UTF8 `
-SmtpServer $smtpServer

可选优化

如果需要更美观的HTML格式邮件,可以把查询结果(去掉Format-Table)用ConvertTo-Html命令转成HTML表格,正文设置为HTML格式即可,兼容性更好,不会出现文本对齐错乱的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:36:03