我认为问题在于您所追求的准确性。(包含小时、分钟和秒的日期,但没有毫秒)
当您创建一个比较 DateTime 对象时
$time = [datetime]'03/24/2021 20:50:37'
你会发现它的.MilliSecond
属性设置为0。
当您将其与 eventsTimeCreated
属性进行比较时,日期实际上具有与 MiliSecond 相同的确切时间的可能性非常0
小..
这就是为什么您需要从事件的属性中去除毫秒(以及这些毫秒的分数)TimeCreated
,以便能够与确切的日期进行比较,但没有毫秒:
$time = [datetime]'03/24/2021 20:50:37'
(Get-WinEvent -LogName System) |
Where-Object { ($_.TimeCreated.AddTicks(-$_.TimeCreated.Ticks % [timespan]::TicksPerSecond)) -eq $time }
如果需要,您当然可以将其置于循环中以扫描不同的日志名称
根据您的评论,该Get-WinEvent
cmdlet 返回具有许多属性的对象。PowerShell 的标准方式是在屏幕上输出这些属性的子集TimeCreated, Id, LevelDisplayName and Message
,在本例中为.
如果您还希望在此输出中显示事件日志的名称,请将 Select-Object 添加到命令中,例如:
$time = [datetime]'04/19/2021 08:38:20'
(Get-WinEvent –ListLog * -ErrorAction SilentlyContinue).LogName | ForEach-Object {
Get-WinEvent -LogName $_ |
Where-Object { ($_.TimeCreated.AddTicks(-$_.TimeCreated.Ticks % [timespan]::TicksPerSecond)) -eq $time} |
# output the properties you are interested in
Select-Object LogName, TimeCreated, Id, LevelDisplayName, Message
}
为了使其更加灵活,请将结果捕获到一个变量中,以便您既可以在屏幕上显示,也可以将结果保存到 Csv 文件以供以后检查:
$time = [datetime]'04/19/2021 08:38:20'
$result = (Get-WinEvent –ListLog * -ErrorAction SilentlyContinue).LogName | ForEach-Object {
Get-WinEvent -LogName $_ |
Where-Object { ($_.TimeCreated.AddTicks(-$_.TimeCreated.Ticks % [timespan]::TicksPerSecond)) -eq $time} |
# output the properties you are interested in
Select-Object LogName, TimeCreated, Id, LevelDisplayName, Message
}
# output on screen
$result
# save to Csv File
$result | Export-Csv -Path 'Path\To\The\Output.csv' -NoTypeInformation -UseCulture
要查看返回的所有属性的名称,您可以执行以下操作
Get-WinEvent -LogName System | Select-Object -First 1 | fl *