考虑以下 MWE:
# Current time is the end time of when we look for events
$now = Get-Date
$around = New-TimeSpan -Seconds 7200
# Define start time, too
$before = $now.Subtract($around)
Write-Host "Events from $before to $now"
# List events from those two logs
$rawevents = Get-WinEvent -LogName @("Application", "System", "PowerShellCore/Operational", "Windows PowerShell")
# Just show the number of events from all the logs
Write-Host $rawevents.Count
# Filter down the list by creation time of the event record
$fltevents = $rawevents|Where-Object -Property TimeCreated -LE $now|Where-Object -Property TimeCreated -GE $before
# Show filtered count
Write-Host $fltevents.Count
现在这里的问题是我还没有找到一种方法来过滤在初始调用Get-WinEvent
期间返回的记录,因此不得不求助于使用Where-Object
. 但可以说,对于更大的日志,将查询限制在给定的时间范围内可能会快得多。例如,$rawevents
我的系统上的计数约为 50000,但过滤后通常少于 20。
有了and参数可以“预先”使用,Get-EventLog
但是-Before
-After
- 我在 PowerShell Core 7.2.6 中看不到这个 cmdlet
- 它的文档指出:
Get-EventLog
使用已弃用的 Win32 API。结果可能不准确。请改用Get-WinEvent
cmdlet。
问题:那么有没有办法通过丢弃大部分事件来实现同样的目标而不浪费系统资源?即在查询时过滤。
您可以更改初始调用
Get-WinEvent
以包含$before
和$now
变量。您还可以使用-FilterHashTable
然后传递哈希表中的日志名以及您要查找的事件的开始和结束时间。