Get-WinEvent 是什么
Get-WinEvent 是读取 Windows 事件日志的主力命令,可以按日志通道、时间范围、事件编号与级别等条件取回记录,返回的是包含时间、来源、编号、级别与完整消息的事件对象。相比更早的日志命令,它支持的通道更全,筛选条件也更强,尤其是按编号与时间组合过滤时可以显著减少读取量。排查故障时通常先用它把可疑时间段的事件取出来,再按编号或来源进一步收敛,最后导出留档。
基本信息
| 适用平台 | Windows PowerShell 5.1 与 PowerShell 7 及以上(Windows 平台) |
|---|---|
| 简洁语法 | Get-WinEvent -LogName System -MaxEvents 50 -Level 2 |
| 强条件语法 | Get-WinEvent -FilterHashtable @{LogName='System'; Id=41,6008; StartTime=(Get-Date).AddDays(-1)} |
| 常用通道 | 系统、应用程序、安全(安全日志需管理员权限) |
| 级别取值 | 1 严重、2 错误、3 警告、4 信息、5 详细 |
| 返回对象 | 时间、来源提供程序、事件编号、级别、完整消息与属性数组 |
典型使用场景
- 按时间窗取回故障时段的事件,观察前后顺序
- 按事件编号精确定位已知的故障类型
- 只看错误与警告级别,跳过大量信息级记录
- 统计某类事件在一天内出现的次数与分布规律
- 把结果导出成文件,作为工单附件或留档证据
- 在远程主机上读取日志,集中排查多台机器
常用示例
常用示例
# 取最近 20 条系统日志
Get-WinEvent -LogName System -MaxEvents 20
# 只看错误级别
Get-WinEvent -LogName System -MaxEvents 50 -Level 2
# 过滤出错误并只显示关键列
Get-WinEvent -LogName Application | Where-Object LevelDisplayName -eq 'Error' |
Select-Object -First 10 TimeCreated, ProviderName, Id, Message
# 按编号与时间窗组合筛选,效率更高
Get-WinEvent -FilterHashtable @{LogName='System'; Id=6008,41; StartTime=(Get-Date).AddDays(-3)} | Sort-Object TimeCreated
# 远程读取并导出
Get-WinEvent -ComputerName app01 -LogName System -MaxEvents 100 | Export-Csv D:\evt\app01.csv -Encoding UTF8 -NoTypeInformation
# 统计来源分布
Get-WinEvent -LogName System -MaxEvents 500 | Group-Object ProviderName | Sort-Object Count -Descending | Select-Object -First 5 Name, Count常用参数与级别
| 参数或取值 | 含义 | 注意点 |
|---|---|---|
| -LogName | 指定日志通道 | 通道名区分大小写不敏感,但需存在 |
| -MaxEvents | 限制返回条数 | 从最新往回取,时间范围仍需自行判断 |
| -Level | 按级别过滤,可给多个值 | 比取回后过滤更省资源 |
| -FilterHashtable | 按编号、时间等组合过滤 | 长时段排查优先用它 |
| -ComputerName | 读取远程主机日志 | 需要相应权限与网络可达 |
| 1 到 5 级别 | 严重到详细 | 问题排查通常只看 1 到 3 |
只是限制条数而不给时间范围时,取到的是最新记录,可能与故障时段无关。有明确时间点时直接使用强条件筛选,既准又快。
安全日志默认需要管理员权限,普通会话读取会报错。跨机排查时还要确认目标主机的远程日志访问权限与网络连通性。