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

如何用Powershell对比Windows服务CSV、统计变更并生成指定格式HTML报告

PowerShell服务状态对比实现方案

核心问题说明

你原来用Compare-Object的方式只会输出差异属性和方向标识SideIndicator,无法同时展示同一服务的前后状态,需要自定义对比逻辑合并前后字段。

完整实现代码

1. 导入前后状态并构建哈希索引

# 导入基准和当前服务状态
$before = Import-Csv -Path "C:\logs\before.csv"
$after = Import-Csv -Path "C:\logs\after.csv"

# 按服务名称构建哈希表,实现O(1)效率查找
$beforeHash = $before | Group-Object -Property Name -AsHashTable -AsString
$afterHash = $after | Group-Object -Property Name -AsHashTable -AsString

2. 筛选变更服务并构建自定义结果对象

$changedServices = @()
# 遍历所有存在的服务名称(包含基准有当前无、当前有基准无的新增/删除服务)
$allServiceNames = $beforeHash.Keys + $afterHash.Keys | Select-Object -Unique

foreach ($name in $allServiceNames) {
    $beforeItem = $beforeHash[$name]
    $afterItem = $afterHash[$name]

    # 初始化属性值,处理服务新增/删除场景
    $beforeStartType = $beforeItem ? $beforeItem.StartType : "服务已删除"
    $afterStartType = $afterItem ? $afterItem.StartType : "服务已新增"
    $beforeStatus = $beforeItem ? $beforeItem.Status : "服务已删除"
    $afterStatus = $afterItem ? $afterItem.Status : "服务已新增"
    $displayName = $beforeItem ? $beforeItem.DisplayName : $afterItem.DisplayName

    # 判断是否有启动类型或运行状态变更
    if ($beforeStartType -ne $afterStartType -or $beforeStatus -ne $afterStatus) {
        $changedServices += [PSCustomObject]@{
            服务名称 = $name
            显示名称 = $displayName
            基准启动类型 = $beforeStartType
            当前启动类型 = $afterStartType
            基准运行状态 = $beforeStatus
            当前运行状态 = $afterStatus
        }
    }
}

# 变更服务总数,可直接填入邮件正文
$changeCount = $changedServices.Count

3. 生成带样式的HTML报告

# 定义CSS样式,可自定义调整
$css = @"
<style>
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
tr:nth-child(even) { background-color: #f9f9f9; }
</style>
"@

# 生成HTML报告
$changedServices | ConvertTo-Html -Head $css -Title "服务状态变更报告" -PreContent "<h2>本次共检测到 $changeCount 个服务发生变更</h2>" | Set-Content "C:\logs\comparison.html"

4. 邮件发送参考示例(可选)

# 配置邮件参数
$mailParams = @{
    To = "收件人邮箱"
    From = "发件人邮箱"
    Subject = "Windows服务状态变更告警"
    Body = "本次扫描共检测到 $changeCount 个服务发生启动类型或运行状态变更,详细变更内容请查看附件报告。"
    SmtpServer = "你的SMTP服务器地址"
    Attachments = "C:\logs\comparison.html"
}

# 发送邮件
Send-MailMessage @mailParams

效果说明

  • 生成的HTML报告自动包含变更统计值,且每个服务同时展示基准、当前的启动类型和运行状态
  • 自动覆盖服务新增、删除、属性变更三种场景
  • 统计值$changeCount可直接复用在邮件正文、报告抬头等位置

内容的提问来源于stack exchange,提问作者Rubén Andrés García

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:06:01