有没有办法在查询期间“预先过滤” Get-WinEvent 输出?

有没有办法在查询期间“预先过滤” Get-WinEvent 输出?

考虑以下 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有一个可以“预先”使用的-Beforeand参数,但是-After

  1. 我在 PowerShell Core 7.2.6 中没有看到此 cmdlet
  2. 其文献记载:

    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}

相关内容