我正在编写一个PowerShell脚本,该脚本需要能够获取查询System
事件日志并使用Event ID 1074查找指示关闭的事件。
为此,我使用了以下代码,但是,我注意到,在具有更大System
事件日志的服务器上运行代码时,该命令需要花费很长时间才能完成。
Get-WinEvent -LogName 'System' | Where-Object { $_.Id -eq 1074 }
有没有办法改善这段代码的性能?
答案 0 :(得分:3)
与Get-WinEvent
相比,使用Get-EventLog
可获得的第一项性能提升。这是因为Get-WinEvent
取代了Get-EventLog
和is supposed to perform better。
我发现了一个fantastic article by Ed Wilson,其中非常详细地介绍了如何提高查询的性能,例如我上面发布的查询。我将重点介绍为大幅提高脚本性能而进行的性能调整。
-LogName
参数,而应使用生成您要查找的事件的提供程序的适当-ProviderName
(Ed的博客文章详细介绍了如何找到此事件)。就我而言,我需要使用User32
提供程序,因为那是生成我感兴趣的1074
事件的提供程序。Where-Object
子句。此子句将遍历传入它的所有事件,仅查找具有1074
ID的事件。为避免这种情况,Get-WinEvent具有-FilterHashtable
parameter,可用于过滤Get-WinEvent
cmdlet中的查询结果,从而提高效率。正如Microsoft文档中引用的那样: “使用大型事件日志时,将对象沿管道发送到Where-Object命令效率不高。” 我已经实现了上述概念,并使用Measure-Command
cmdlet和-Expression
参数对每个概念进行了改进,以显示性能差异。请注意,我正在测试的计算机在System
日志中有23,581个事件。
Measure-Command -Expression {
Get-WinEvent -LogName 'System' | Where-Object { $_.Id -eq 1074 }
}
# TotalSeconds : 7.600536
ProviderName
与LogName
Measure-Command -Expression {
Get-WinEvent -ProviderName 'User32' | Where-Object { $_.Id -eq 1074 }
}
# TotalSeconds : 0.1929325
FilterHashtable
Measure-Command -Expression {
Get-WinEvent -FilterHashtable @{ProviderName = "User32"; Id = 1074}
}
# TotalSeconds : 0.1578928