如何用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
相关产品推荐
相关产品推荐

