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

PowerShell实现Azure应用服务批量启停及状态邮件表格生成

Azure PowerShell批量启停应用并推送状态HTML邮件解决方案

核心修改思路

  1. 先筛选出所有处于运行状态的Web App和Function App,统一收集到列表中
  2. 批量停止这些应用,逐个记录每个应用的停止时间、操作状态
  3. 等待3分钟(确保所有应用完全停止)
  4. 批量启动之前停止的应用,逐个记录启动时间、操作状态
  5. 将所有应用的启停状态整合成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"

关键部分说明

  1. 应用收集逻辑:通过Get-AzWebApp和Get-AzFunctionApp筛选出State为Running的应用,统一存入自定义对象列表,方便后续批量操作和状态记录。
  2. 状态验证:启停操作后,再次调用Get-AzWebApp/Get-AzFunctionApp获取实时状态,避免仅依赖命令返回值导致的状态不准确。
  3. 等待时间:用Start-Sleep -Seconds 180确保3分钟等待,可根据实际应用启停耗时调整时长。
  4. HTML表格美化:内嵌CSS样式让表格更易读,成功状态标绿、失败标红,提升邮件可读性。
  5. 错误处理:通过try-catch捕获操作异常,记录具体错误信息到状态字段,便于排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:13:15