PowerShell实现Azure应用服务批量启停及状态邮件表格生成
Azure PowerShell批量启停应用并推送状态HTML邮件解决方案
核心修改思路
- 先筛选出所有处于运行状态的Web App和Function App,统一收集到列表中
- 批量停止这些应用,逐个记录每个应用的停止时间、操作状态
- 等待3分钟(确保所有应用完全停止)
- 批量启动之前停止的应用,逐个记录启动时间、操作状态
- 将所有应用的启停状态整合成HTML表格,通过邮件发送
完整修改后的代码
# 1. 初始化变量与登录Azure(如果未登录) Connect-AzAccount -Identity # 用托管身份登录,或者用Connect-AzAccount交互式登录 $subscriptionId = "你的订阅ID" Select-AzSubscription -SubscriptionId $subscriptionId # 邮件配置 $smtpServer = "smtp.office365.com" $smtpPort = 587 $smtpUser = "你的发件邮箱" $smtpPassword = ConvertTo-SecureString "你的邮箱密码/应用密码" -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential ($smtpUser, $smtpPassword) $toEmail = "收件邮箱@example.com" $subject = "Azure应用批量启停状态报告" # 2. 收集所有运行中的Web App和Function App $runningApps = @() # 获取运行中的Web App $webApps = Get-AzWebApp | Where-Object { $_.State -eq "Running" } foreach ($app in $webApps) { $runningApps += [PSCustomObject]@{ AppName = $app.Name ResourceGroup = $app.ResourceGroup AppType = "Web App" StopTime = $null StopStatus = $null StartTime = $null StartStatus = $null } } # 获取运行中的Function App $functionApps = Get-AzFunctionApp | Where-Object { $_.State -eq "Running" } foreach ($app in $functionApps) { $runningApps += [PSCustomObject]@{ AppName = $app.Name ResourceGroup = $app.ResourceGroup AppType = "Function App" StopTime = $null StopStatus = $null StartTime = $null StartStatus = $null } } if ($runningApps.Count -eq 0) { Write-Host "没有处于运行状态的应用需要操作" # 可选:发送无操作邮件 Send-MailMessage -SmtpServer $smtpServer -Port $smtpPort -Credential $credential -From $smtpUser -To $toEmail -Subject $subject -Body "当前没有处于运行状态的Azure应用需要批量启停操作。" -BodyAsHtml exit } # 3. 批量停止应用并记录状态 foreach ($app in $runningApps) { $stopTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $app.StopTime = $stopTime try { if ($app.AppType -eq "Web App") { Stop-AzWebApp -ResourceGroupName $app.ResourceGroup -Name $app.Name -Force # 验证停止状态 $stoppedApp = Get-AzWebApp -ResourceGroupName $app.ResourceGroup -Name $app.Name if ($stoppedApp.State -eq "Stopped") { $app.StopStatus = "成功" } else { $app.StopStatus = "失败(当前状态:$($stoppedApp.State))" } } else { Stop-AzFunctionApp -ResourceGroupName $app.ResourceGroup -Name $app.Name -Force # 验证停止状态 $stoppedApp = Get-AzFunctionApp -ResourceGroupName $app.ResourceGroup -Name $app.Name if ($stoppedApp.State -eq "Stopped") { $app.StopStatus = "成功" } else { $app.StopStatus = "失败(当前状态:$($stoppedApp.State))" } } } catch { $app.StopStatus = "失败(错误信息:$($_.Exception.Message))" } } # 4. 等待3分钟,确保应用完全停止 Write-Host "等待3分钟,确保所有应用停止完成..." Start-Sleep -Seconds 180 # 5. 批量启动应用并记录状态 foreach ($app in $runningApps) { $startTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $app.StartTime = $startTime try { if ($app.AppType -eq "Web App") { Start-AzWebApp -ResourceGroupName $app.ResourceGroup -Name $app.Name # 验证启动状态 $startedApp = Get-AzWebApp -ResourceGroupName $app.ResourceGroup -Name $app.Name if ($startedApp.State -eq "Running") { $app.StartStatus = "成功" } else { $app.StartStatus = "失败(当前状态:$($startedApp.State))" } } else { Start-AzFunctionApp -ResourceGroupName $app.ResourceGroup -Name $app.Name # 验证启动状态 $startedApp = Get-AzFunctionApp -ResourceGroupName $app.ResourceGroup -Name $app.Name if ($startedApp.State -eq "Running") { $app.StartStatus = "成功" } else { $app.StartStatus = "失败(当前状态:$($startedApp.State))" } } } catch { $app.StartStatus = "失败(错误信息:$($_.Exception.Message))" } } # 6. 生成HTML表格 $htmlHeader = @" <html> <head> <style> table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th { background-color: #f2f2f2; } .success { color: green; } .failed { color: red; } </style> </head> <body> <h3>Azure应用批量启停状态报告</h3> <table> <tr> <th>应用名称</th> <th>应用类型</th> <th>资源组</th> <th>停止时间</th> <th>停止状态</th> <th>启动时间</th> <th>启动状态</th> </tr> "@ $htmlRows = "" foreach ($app in $runningApps) { $stopStatusClass = if ($app.StopStatus -eq "成功") { "success" } else { "failed" } $startStatusClass = if ($app.StartStatus -eq "成功") { "success" } else { "failed" } $htmlRows += @" <tr> <td>$($app.AppName)</td> <td>$($app.AppType)</td> <td>$($app.ResourceGroup)</td> <td>$($app.StopTime)</td> <td class="$stopStatusClass">$($app.StopStatus)</td> <td>$($app.StartTime)</td> <td class="$startStatusClass">$($app.StartStatus)</td> </tr> "@ } $htmlFooter = @" </table> </body> </html> "@ $htmlBody = $htmlHeader + $htmlRows + $htmlFooter # 7. 发送邮件 Send-MailMessage -SmtpServer $smtpServer -Port $smtpPort -Credential $credential -From $smtpUser -To $toEmail -Subject $subject -Body $htmlBody -BodyAsHtml Write-Host "操作完成,状态报告已发送至邮箱:$toEmail"
关键部分说明
- 应用收集逻辑:通过
Get-AzWebApp和Get-AzFunctionApp筛选出State为Running的应用,统一存入自定义对象列表,方便后续批量操作和状态记录。 - 状态验证:启停操作后,再次调用
Get-AzWebApp/Get-AzFunctionApp获取实时状态,避免仅依赖命令返回值导致的状态不准确。 - 等待时间:用
Start-Sleep -Seconds 180确保3分钟等待,可根据实际应用启停耗时调整时长。 - HTML表格美化:内嵌CSS样式让表格更易读,成功状态标绿、失败标红,提升邮件可读性。
- 错误处理:通过
try-catch捕获操作异常,记录具体错误信息到状态字段,便于排查问题。
内容的提问来源于stack exchange,提问作者Sivaani
相关产品推荐
相关产品推荐

