0

我试图通过Get-EventLog在 Powershell 中获得 Windows Sever 2008 机器的意外关机时间。我可以通过搜索带有EventID6008 的事件并选择 only来接近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.`
4

3 回答 3

3

从远程主机检索所有事件并在本地计算机上过滤它们通常表现不佳,因为这样您通过网络传输大量不相关的事件,只是为了丢弃它们。Get-EventLog具有通过事件 ID 或源上给定时间戳之前/之后过滤消息的选项,因此最好使用这些选项来预先选择您真正感兴趣的消息。崩溃的时间戳可以从Message字段中提取表达式并通过以下方式解析为一个DateTimeParseExact()

$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(最后一个是计算的属性)。如果您在变量中收集管道的输出(例如$evt),您可以Crashtime像这样访问第三个对象的属性:

$evt = .\script.ps1
$evt[2].Crashtime
于 2014-08-08T23:36:45.510 回答
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
于 2014-08-08T20:04:16.927 回答
1

更容易

get-eventlog system  | where-object {$_.EventID -eq  "6008"} | fl
于 2016-04-19T16:12:04.460 回答