Powershell:如何从事件日志的消息字段中提取时间?

时间:2014-08-08 19:56:30

标签: powershell event-log get-eventlog

我试图通过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.`

3 个答案:

答案 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)}}

管道生成一个对象列表,其中包含属性MachineNameTimeGeneratedCrashtime(最后一个为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