考虑以下 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。
和Get-EventLog
有一个可以“预先”使用的-Before
and参数,但是-After
- 我在 PowerShell Core 7.2.6 中没有看到此 cmdlet
- 其文献记载:
Get-EventLog
使用已弃用的 Win32 API。结果可能不准确。请Get-WinEvent
改用 cmdlet。
问题:那么有没有一种方法可以实现相同的目的,而又不会因为丢弃大多数事件而浪费系统资源?即过滤尽管查詢。
答案1
您可以更改初始调用Get-WinEvent
以包含$before
和$now
变量。您还可以使用-FilterHashTable
并传递哈希表中的日志名称以及您要查找的事件的开始和结束时间。
$rawevents = Get-WinEvent -FilterHashTable @{Logname="Application", "System", "PowerShellCore/Operational", "Windows PowerShell";StartTime=$before;EndTime=$now}