PowerShell脚本可自动生成Windows健康报告,采集CPU、内存、磁盘、服务、事件日志及启动项等指标,输出HTML或CSV格式并支持定时执行。
用powershell脚本自动生成windows系统健康报告,核心是采集关键指标(cpu、内存、磁盘、服务状态、事件日志、启动项等),按需格式化输出为html或csv,再定时执行。无需第三方工具,纯系统自带能力即可实现。
一、收集核心系统健康指标
PowerShell内置cmdlet可直接获取运行时状态:
-
CPU与内存:用
Get-Counter读取性能计数器,如"\Processor(_Total)\% Processor Time"和"\Memory\Available MBytes" -
磁盘空间:用
Get-PSDrive -PSProvider 'FileSystem'或Get-WmiObject Win32_Volume获取各卷使用率,过滤低于15%的告警项 -
关键服务状态:用
Get-Service | Where-Object {$_.StartType -eq 'Automatic' -and $_.Status -ne 'Running'}找出应启未启的服务 -
最近系统错误:用
Get-WinEvent -FilterHashtable @{LogName='System'; Level=1,2; StartTime=(Get-Date).AddHours(-24)}提取近24小时严重/错误事件 -
开机启动项:用
Get-CimInstance Win32_StartupCommand或Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run检查异常启动项
二、生成可读性强的HTML报告
避免拼接HTML字符串,推荐用 ConvertTo-Html + 自定义CSS提升可读性:
- 将各模块数据存为PSCustomObject数组(如
$reportData = @()),统一字段名便于转换 - 用
ConvertTo-Html -Fragment分段生成表格,再用-Head参数注入简洁CSS样式(例如红标告警行、绿色正常行) - 顶部插入系统信息(主机名、OS版本、生成时间),底部加摘要栏(如“发现2项服务异常、1个磁盘剩余
- 保存时指定完整路径:
Out-File -FilePath "$env:USERPROFILE\Desktop\SystemHealth_$(Get-Date -Format 'yyyyMMdd_HHmm').html" -Encoding UTF8
三、设置定时自动执行(任务计划程序)
让报告每天凌晨自动生成并归档:
通过 SSH 隧道从 Android 设备在互联网上对 Windows PC 实现完整远程控制的设置与使用指南,适用于远程桌面访问、安全 RDP 等。
- 将脚本保存为
Generate-SystemHealth.ps1,确保已配置执行策略:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser - 用
Register-ScheduledTask创建计划任务,触发器设为每日指定时间,操作指向powershell.exe并传参:-ExecutionPolicy Bypass -File "C:\Scripts\Generate-SystemHealth.ps1" - 建议启用“不管用户是否登录都要运行”+“使用最高权限”,避免交互式会话限制
- 可额外添加清理逻辑:脚本末尾用
Get-ChildItem "$env:USERPROFILE\Desktop\SystemHealth_*.html" | Where-Object LastWriteTime -lt (Get-Date).AddDays(-7) | Remove-Item自动删除7天前报告
四、实用增强技巧
让报告更贴合运维实际需求:
-
支持远程批量扫描:在脚本开头加参数
[string[]]$ComputerName = @('localhost'),后续用Invoke-Command -ComputerName $c -ScriptBlock { ... }收集多台机器数据 -
邮件自动发送:调用
Send-MailMessage(需配置SMTP服务器)或使用MailKit库发带附件的HTML报告 -
快速定位问题:报告中为每个异常项附加简明建议,例如磁盘不足时提示“请清理临时文件或扩展卷”,服务异常时附上启动命令
Start-Service -Name 'wuauserv' -
轻量日志记录:用
Add-Content记录每次执行结果到health-run.log,方便排查脚本自身失败原因
不复杂但容易忽略:首次运行前务必手动执行一次脚本,确认所有cmdlet权限正常、WMI/WinRM访问无阻塞,再部署定时任务。

















