【发布时间】:2021-09-22 18:52:51
【问题描述】:
每当多个服务器停止多个服务时,我都会尝试接收单个邮件警报。如果有停止的服务,我制作了一个邮件函数以在循环中调用它。我制作的脚本有效,但它为每个停止的服务发送多封邮件,因为它在循环中......
知道如何在一封邮件中编译所有详细信息吗?
#Clear values in variable in case report needs to be re-run to avoid duplicate info on the html report
Clear-Variable -Name "Body"
Clear-Variable -Name "Body1"
Clear-Variable -Name "serviceslist"
Clear-Variable -Name "service"
Clear-Variable -Name "machines"
Clear-Variable -Name "server"
Function SendMailFromPowershell () {
Get-Service -Name $service -ComputerName $server | Select MachineName, Name, DisplayName, Status, StartType | Sort-Object Name | ConvertTo-Html -Head $Header | Out-File -FilePath ".\report.html"
$Body1 = "<br><h2>Please ensure all services are stopped before cleanup</h2><br>"
$Body1 += Get-Content (".\report.html")
$Body = Out-String -InputObject $Body1 #( This basically converts the Sysytem.Object to System.String)
$SMTPServer = "prodsmtp.ncc.local"
$EmailFrom = "Daily_Report@ncc.local"
$EmailTo = @('noc ncc <noc@ncc.com>')
$EmailSubject = "IISServices on $(Get-Date -Format "yyyy-MM-dd")"
Send-MailMessage -SmtpServer $SMTPServer -From $EmailFrom -To $EmailTo -Subject $EmailSubject -Body $body -BodyAsHtml
}
$machines = 'NPRODWEB01','NPRODWEB02'
$serviceslist = 'IISADMIN','w3logsvc','WinRM','W3SVC','WAS','NetPipeActivator','NetTcpActivator','vds','WcsPlugInService','THREADORDER'
$Header ="<head>
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>
<title>IIS Services</title>"
$Header += @"
<style>
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: #6495ED;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style></head>
"@
foreach ($server in $machines) {
foreach ($service in $serviceslist) {
if(Get-Service -Name $service -ComputerName $server| Where-Object {$_.Status -eq "Running"}) {
Write-Host "$service is Running $server" -ForegroundColor Cyan | Out-String
}
elseif (Get-Service -Name $service -ComputerName $server | Where-Object {$_.Status -eq "Stopped"}) {
Write-Host "$service is stopped on $server" -ForegroundColor Green | Out-String
SendMailFromPowershell
}
else {
Write-Host "$service on $server error! Please manually check on server" -ForegroundColor Green | Out-String
}
}
}
#SendMailFromPowershell
【问题讨论】:
-
为了清楚起见.. 如果 [1] 一个或一些服务停止(它们应该在哪里运行)或 [2} 如果某些服务仍在运行(它们应该在哪里停止)?您的代码建议选项 [1],但电子邮件中的正文是关于选项 [2](“请确保在清理之前停止所有服务”)
-
嗨,是的,还有一堆我没有添加到这个线程的代码,这就是为什么会有评论“请确保在清理之前停止所有服务”我想要的是发送一个包含一个或多个尚未停止的服务的邮件警报,而不是为每个停止的服务接收多个邮件警报(以避免太多邮件)服务在多个服务器上运行(在负载平衡器中)。
-
我们还没有收到您的来信.. 我的回答解决了您的问题吗?如果是这样,请通过单击左侧的 ✓ 图标来考虑accepting。这将帮助其他有类似问题的人更轻松地找到它,并有助于激励其他人回答您将来可能遇到的任何问题。
-
嗨 Theo,对于延迟回复表示歉意。事实上,这正是我想要的。再次非常感谢您的帮助。这也将有助于我将来编写其他脚本:)
标签: windows powershell server scripting taskscheduler