如何编写带计算机名参数的PowerShell脚本实现自动服务巡检及HTML输出?
PowerShell 服务巡检自动修复脚本实现方案
1. 核心逻辑设计
- 入参处理:支持单个/批量计算机名作为输入,默认取本地计算机名
- 服务校验逻辑:优先过滤所有启动类型为自动的服务,默认包含自动(延迟启动)服务,若需排除可修改过滤条件增加
-and $_.DelayedAutoStart -eq $false参数 - 异常处理:启动失败的服务捕获错误信息,从系统事件日志拉取准确的服务停止时间
- 结果输出:结构化存储所有服务状态,自动生成带样式的HTML报表,直接写入IIS默认站点路径
2. 完整脚本实现
param( [Parameter(Mandatory=$false)] [string[]]$ComputerName = $env:COMPUTERNAME ) # 初始化结果存储数组 $serviceReport = @() foreach ($computer in $ComputerName) { try { # 获取目标计算机所有服务列表 $allServices = Get-Service -ComputerName $computer -ErrorAction Stop # 过滤自动启动类服务 $autoServices = $allServices | Where-Object {$_.StartType -eq 'Automatic'} foreach ($service in $autoServices) { $serviceDetail = [PSCustomObject]@{ 计算机名 = $computer 服务名称 = $service.Name 服务显示名 = $service.DisplayName 启动类型 = $service.StartType 当前状态 = $service.Status 停止时间 = $null 启动结果 = $null } # 校验未运行的自动启动服务,尝试自动启动 if ($service.Status -ne 'Running') { # 拉取系统事件日志获取最近24小时内的服务停止时间 $stopEvent = Get-WinEvent -ComputerName $computer -FilterHashtable @{ LogName = 'System' ID = 7036 StartTime = (Get-Date).AddDays(-1) } | Where-Object {$_.Message -match "$($service.DisplayName).*已停止运行" -or $_.Message -match "$($service.Name).*stopped"} | Select-Object -First 1 $serviceDetail.停止时间 = $stopEvent.TimeCreated # 执行服务启动操作 try { Start-Service -InputObject $service -ErrorAction Stop $serviceDetail.当前状态 = 'Running' $serviceDetail.启动结果 = '自动启动成功' } catch { $serviceDetail.启动结果 = "启动失败:$($_.Exception.Message)" } } else { $serviceDetail.启动结果 = '已正常运行' } $serviceReport += $serviceDetail } # 若需统计非自动启动服务状态,取消下方注释即可 <# $nonAutoServices = $allServices | Where-Object {$_.StartType -ne 'Automatic'} foreach ($ns in $nonAutoServices) { $serviceReport += [PSCustomObject]@{ 计算机名 = $computer 服务名称 = $ns.Name 服务显示名 = $ns.DisplayName 启动类型 = $ns.StartType 当前状态 = $ns.Status 停止时间 = $null 启动结果 = '非自动启动服务,不执行启动操作' } } #> } catch { # 捕获计算机连接失败异常 $serviceReport += [PSCustomObject]@{ 计算机名 = $computer 服务名称 = 'N/A' 服务显示名 = '连接失败' 启动类型 = 'N/A' 当前状态 = 'N/A' 停止时间 = $null 启动结果 = "连接计算机失败:$($_.Exception.Message)" } } } # 生成带样式的HTML报表 $htmlHeader = @" <style> body {font-family: 微软雅黑; font-size: 14px; margin: 20px;} table {border-collapse: collapse; width: 100%; margin-top: 15px;} th {background-color: #007ACC; color: white; padding: 8px; text-align: left;} td {border: 1px solid #ddd; padding: 8px;} tr:nth-child(even) {background-color: #f2f2f2;} .status-running {background-color: #ccffcc;} .status-stopped {background-color: #ffcccc;} .status-fail {background-color: #ffebcc;} </style> <title>服务巡检报表 $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')</title> "@ $htmlContent = $serviceReport | ConvertTo-Html -Head $htmlHeader -PreContent "<h2>服务巡检自动修复报表 | 生成时间:$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')</h2>" # 给不同状态的单元格增加高亮样式 $htmlContent = $htmlContent -replace '<td>Running</td>', '<td class="status-running">Running</td>' $htmlContent = $htmlContent -replace '<td>Stopped</td>', '<td class="status-stopped">Stopped</td>' $htmlContent = $htmlContent -replace '<td>启动失败.*?</td>', '<td class="status-fail">$&</td>' # 输出到IIS默认站点路径,确保目录存在且有写入权限 $outputPath = "C:\inetpub\wwwroot\service_report.html" $htmlContent | Out-File -FilePath $outputPath -Encoding utf8 # 控制台返回结果 return $serviceReport
3. 使用说明
- 权限要求:运行脚本的账户需要拥有目标计算机的管理员权限、IIS站点目录的写入权限
- 调用示例:
.\ServiceCheck.ps1 -ComputerName "PC01","SRV01","SRV02" - 访问方式:HTML报表生成后,直接访问
http://<部署脚本的服务器IP>/service_report.html即可查看 - 定时执行:可配合Windows任务计划程序设置定时巡检,自动更新报表内容
内容的提问来源于stack exchange,提问作者mobio19
相关产品推荐
相关产品推荐

