PowerShell自动启动服务告警脚本问题:重复发送同名服务邮件
PowerShell服务告警邮件重复同一服务名称的问题修复
问题根源
- 邮件主题
$Subject和正文$Body在循环外部定义,此时$service变量尚未遍历服务集合,导致所有邮件复用初始值(通常是第一个服务或空值)。 $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
相关产品推荐
相关产品推荐

