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

PowerShell自动启动服务告警脚本问题:重复发送同名服务邮件

PowerShell服务告警邮件重复同一服务名称的问题修复

问题根源

  1. 邮件主题$Subject和正文$Body在循环外部定义,此时$service变量尚未遍历服务集合,导致所有邮件复用初始值(通常是第一个服务或空值)。
  2. $ServerName是单字符串值($env:computername返回当前主机名),外层foreach ($computer in $ServerName)会逐个字符遍历,属于冗余且错误的逻辑。

修改后的脚本

#$Credd = Get-Credential
#$Credd | Export-Clixml -Path C:\Script\EmailCred2.txt
$Credd = Import-Clixml -Path C:\Script\EmailCred2.txt

# 获取主机名
$ServerName = $env:computername

# 邮件基础参数(不含服务相关动态内容)
$From = "alerts@mydomain.com"
$To = "myemail@gmail.com"
$SMTP = "smtp.gmail.com"
$SMTPPort = "587"

# 获取所有自动启动类型的服务
$GetServices = Get-Service | Where-Object { $_.StartType -eq 'Automatic' }

# 遍历每个服务
foreach ($service in $GetServices) {
    if ($service.Status -ne 'Running') {
        try {
            # 尝试启动服务
            Start-Service $service -ErrorAction Stop
            Start-Sleep -Seconds 5
            Write-Host "$($service.Name) 已在 $ServerName 上运行"
        }
        Catch {
            # 输出错误信息
            Write-Host "$($Error[0])" -ForegroundColor Red 

            # 动态生成当前服务的邮件主题和正文
            $Subject = "Alert: Failed to Start $($service.Name) on $ServerName $(Get-Date)"
            $Body = $Subject
            
            # 发送告警邮件
            Send-MailMessage -From $From -To $To -Subject $Subject -SmtpServer $SMTP -Body $Body -Credential $Credd -UseSsl -Port $SMTPPort
        }
    }
}

关键修改说明

  • 将$Subject和$Body的定义移至foreach ($service)循环内部,确保每次循环都基于当前服务生成专属的邮件内容。
  • 移除了多余的foreach ($computer in $ServerName)循环,因为$env:computername返回单个主机名,无需遍历。
  • 拆分了邮件参数的定义结构,静态参数与动态参数分离,提升代码可读性与维护性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:30:13