Considere o seguinte 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
Agora, o problema aqui é que não encontrei uma maneira de filtrar os registros retornados Get-WinEvent
durante a invocação inicial e, portanto, tenho que recorrer ao uso de Where-Object
. Mas, sem dúvida, para logs maiores, pode ser muito mais rápido limitar a consulta a um determinado intervalo de tempo. Por exemplo, a contagem $rawevents
é de ~ 50.000 no meu sistema, mas geralmente menos de 20 permanecem após a filtragem.
Com Get-EventLog
há o argumento -Before
e -After
que pode ser usado "na frente", mas
- Não vejo este cmdlet no PowerShell Core 7.2.6
- Sua documentação afirma:
Get-EventLog
usa uma API Win32 que foi preterida. Os resultados podem não ser precisos. Use oGet-WinEvent
cmdlet em vez disso.
Pergunta: Então, existe uma maneira de conseguir o mesmo sem desperdiçar recursos do sistema jogando fora a maioria dos eventos de qualquer maneira? Ou seja, filtragem durante a consulta.