我试图通过Powershell中的Get-EventLog
获取Windows Sever 2008计算机的意外关机时间。我可以通过搜索EventID
为6008并仅选择message
的事件来接近,但我需要在字段内解析以获取它发生的时间(而不是事件触发的时间)。
我已尝试使用replacementstrings[x]
,但我无法找到如何指定要使用的字段(messages
)并且无法获得结果。
get-eventlog -LogName System -ComputerName svr-name | Where-Object {$_.EventID -eq 6008 -AND $_.timegenerated -gt (get-date).adddays(-30)}| select message
产生这个:
Message
-------
The previous system shutdown at 3:35:32 AM on 7/29/2014 was unexpected.
The previous system shutdown at 3:40:06 PM on 7/10/2014 was unexpected.`
答案 0 :(得分:3)
从远程主机检索所有事件并通常在本地计算机上过滤这些事件的效果并不理想,因为这样您就可以通过网络传输大量不相关的事件,只是为了将它们丢弃。 Get-EventLog
具有按事件ID过滤消息或在源上给定时间戳之前/之后过滤消息的选项,因此最好使用它们来预先选择您真正感兴趣的消息。可以从中提取崩溃的时间戳。带有正则表达式的Message
字段,并通过ParseExact()
解析为DateTime
值:
$log = 'System'
$server = 'svr-name'
$id = [uint64]"0x80000000" + 6008
$date = (Get-Date).AddDays(-30)
$fmt = 'h:mm:ss tt on M\/d\/yyyy'
$culture = [Globalization.CultureInfo]::InvariantCulture
Get-EventLog -LogName $log -ComputerName $server -InstanceId $id -After $date | ? {
$_.Message -match 'at (\d+:\d+:\d+ [ap]m on \d+/\d+/\d+) was unexpected'
} | select MachineName, TimeGenerated,
@{n='Crashtime';e={[DateTime]::ParseExact($matches[1], $fmt, $culture)}}
管道生成一个对象列表,其中包含属性MachineName
,TimeGenerated
和Crashtime
(最后一个为calculated property)。如果您在变量中收集管道的输出(例如$evt
),您可以像这样访问第三个对象的Crashtime
属性:
$evt = .\script.ps1
$evt[2].Crashtime
答案 1 :(得分:2)
使用正则表达式,您可以将其拉出来。
$Messages = (get-eventlog -LogName System -ComputerName svr-name | Where-Object {$_.EventID -eq 6008 -AND $_.timegenerated -gt (get-date).adddays(-30) }| select message)
$Messages | ForEach-Object {
$Matched = $_.Message -match "([0-9]{1,2}:.*[0-9]{4})"
if ($Matched) {
Write-Output "System rebooted at $($Matches[1])"
}
}
可能有更好的方法,但我不知道是什么:)
系统输出示例
System rebooted at 4:34:30 PM on 4/20/2014
System rebooted at 1:48:38 PM on 1/21/2014
System rebooted at 1:37:12 PM on 1/21/2014
System rebooted at 1:22:01 PM on 1/21/2014
System rebooted at 4:41:21 PM on 11/22/2013
答案 2 :(得分:1)
更轻松
get-eventlog system | where-object {$_.EventID -eq "6008"} | fl