2014-09-29 65 views
0

我有一個Powershell腳本,它使用Get-EventLog在遠程服務器上搜索事件600560066008;經過一些操作後,它將返回數組中的結果。Powershell:將陣列拆分成對並丟棄,如果不交替

$eventData += Get-EventLog -computerName $server_name -LogName system ` 
-After $prevMonthBegin -Before $prevMonthEnd |  
    Where-Object ` 
    { $_.eventid -eq 6005 -OR $_.eventID -eq 6006 -OR $_.eventID -eq 6008 } | 
    Select timegenerated, eventid, message, index, recordid | sort-object timegenerated 

我遍歷的結果,並分配任一downup$eventData.message字段和由timegenerated再次對它進行排序這將返回像這樣(道歉格式化)的數組:

$eventData | Sort-Object timegenerated | format-table 

TimeGenerated EventID消息索引
------------- ------- ------- ----- --------
8/3/2014 5:30:02 AM 6006 down 0
2014年8月3日上午五點30分47秒6005向上0
2014年8月24日上午05時31分00秒6005向上0
2014年8月31日上午02時34分59秒6008向下1
2014年8月31日上午05時30分04秒6006下跌0
2014年8月31日上午05時三十分59秒6005了0
2014年8月31日上午05時36分26秒6005了0

我怎樣才能從這些結果創建一個新的數組,並安排TimeGenerated上/下對?如果它是up(所以總是有down,然後up成對),我寧願忽視陣列的第一個事件,但我可以解決這個問題。如上面的示例輸出一樣,永遠不會有兩個連續的downup事件更爲重要。

我想通過事件也許迭代和切換10(或updown)之間的臨時變量,但似乎笨重,我什麼都做不了的工作。這不應該這麼難,但這就是我尋求幫助的原因。讓我知道是否提供更多的代碼是有用的;有一個相當多的,我不想只是轉儲它的網頁。

這裏是我想要的數組格式的一個例子。我正在使用的方法將這些事件配對爲12121212,而無需查看它們是什麼類型的事件。因此,在上面的示例中,最後一個事件對將計算不存在的停機時間,因爲存在兩個事件up(6005)。

Downtime   Uptime    CrashEvent? 
8/3/2014 5:30:02 AM 8/3/2014 5:30:47 AM 0 
8/24/2014 5:31:00 AM 8/31/2014 2:34:59 AM 0 
8/31/2014 2:34:59 AM 8/31/2014 5:30:04 AM 1 
8/31/2014 5:30:59 AM 8/31/2014 5:36:26 AM 0 
+0

你可以發佈一個你想要的結果的例子嗎?給定發佈的輸入數據? – mjolinor 2014-09-29 20:33:43

+0

我剛剛編輯了我的問題以包含此內容。謝謝。 – kiwisan 2014-09-29 20:42:48

+0

你只是在尋找有多久了?就像在8/31/2014 05:30:04 AM時一樣,在2014年8月31日05:30:59回來了?這應該是可行的。 – TheMadTechnician 2014-09-29 20:43:40

回答

2

下面是如何做到這一點的答案,應該跳過重複的條目。但是,您可能需要調整正在查詢的事件,否則最終會出現同時發生向下/向上的情況。

$Events = Get-EventLog -LogName system |  
Where-Object { $_.eventid -eq 6005 -OR $_.eventID -eq 6006 -OR $_.eventID -eq 6008 } | 
Select timegenerated, eventid, message, index, recordid | sort-object timegenerated 


[array]$FullObj = [pscustomobject] @{ 
     'Time' = '' 
     'Status' = '' 
     'Message' = '' 
     } 

Foreach ($Event in $Events) 
{ 
    If ($Event.Message -eq 'The Event log service was started.' -and $fullobj.status[-1] -ne 'UP') 
    { 
     [array]$FullObj += [pscustomobject] @{ 
     'Time' = $Event.TimeGenerated 
     'Status' = 'UP' 
     'Message' = $Event.Message 
     } 
    } 
    Elseif ($fullobj.status[-1] -eq 'UP' -and $fullobj.Message[-1] -notlike "The previous system shutdown*") 
    { 
     [array]$FullObj += [pscustomobject] @{ 
     'Time' = $Event.TimeGenerated 
     'Status' = 'DOWN' 
     'Message' = $Event.Message 
     } 
    } 
} 

$FullObj | select time,status 
+0

這很可愛,但它確實不是他想要的。 – TheMadTechnician 2014-09-29 21:52:49

+0

這是根據他寫的。他的例子沒有任何意義,因爲當前兩列已經顯示出來,然後是正常的時候,碰撞值應該是什麼?它可以被重做,沒有太多的麻煩,只是在每一行上顯示/停留時間,而不是我想的。無論哪種方式,儘管他所查詢的數據對於這個目的來說是毫無價值的,監控時間應該用一個應用程序來完成這個目的。nagios有一個小型的免費版本,可能還有其他一些。 – 2014-09-29 22:32:11

+0

我同意他的樣本數據是垃圾,並且很難確定他究竟想要什麼,但他想要的輸出格式相當清晰,我認爲即使它與他的樣本數據不匹配。僅供參考,6005是Windows即將上市,6006是計劃關機,6008是意外關機,所以6008是他的崩潰數據是有道理的。 – TheMadTechnician 2014-09-29 22:39:30

3

確定,這應該選擇最後先下一相反類型的任何遞減或遞增事件(一個之前下一頁尾,和一個向下前上漲了),我認爲這是你想要的。基本上匹配每次系統停機時間和恢復時間,如果連續有多個,則使用最後的正常運行時間/停機時間通知。我認爲你的整個'丟棄任何順序重複事件類型的第一個'是錯誤的,但是這確實如此。

從Noah Sparks複製的事件集合與選擇參數修剪了一下。然後進入Switch,每當發生Downtime事件時創建一個自定義對象,然後設置每個正常運行時間的正常運行時間,並在下一次停機事件發生時重新輸出。

$Events = Get-EventLog -LogName system |  
    Where-Object { $_.eventid -eq 6005 -OR $_.eventID -eq 6006 -OR $_.eventID -eq 6008 } | 
     Select timegenerated, eventid | sort-object timegenerated 
$record=$null 
$Output = Switch($Events){ 
    {$_.EventID -match "600(6|8)"}{if(![string]::IsNullOrEmpty($Record.up)){$record} 
            $Record=[pscustomobject][ordered]@{ 
             'Down'=$_.timegenerated 
             'Up'=$null 
             'Expected'=If($_.EventID -eq 6006){$true}else{$false} 
            }} 
    {$_.EventID -eq "6005"}{$Record.Up = $_.TimeGenerated} 
} 
$Output += $record 
$Output 

就我個人而言,即使在停機事件發生後,我也會第一次正常運行,但那只是我。這需要一些不同的編碼。無論如何,該結果是這樣(用我自己的事件日誌條目):

Down       Up        Expected 
----       --        -------- 
11/20/2013 8:47:42 AM   11/20/2013 8:49:11 AM     True 
11/20/2013 3:50:14 PM   12/13/2013 9:14:52 AM     True 
12/13/2013 9:26:21 AM   12/13/2013 9:27:42 AM    False 
12/13/2013 3:40:07 PM   12/13/2013 3:41:31 PM     True 
1/9/2014 1:13:31 PM   1/16/2014 12:38:08 PM     True 
1/16/2014 12:39:21 PM   1/16/2014 12:48:44 PM     True 

如果你看一下第二個上市那裏,我知道我的電腦是不下來從11/20到12/13,但丟棄它是如何碰到的第一個順序重複。如果我們沒有這樣做,它會顯示系統在下降一分鐘後恢復,這對我的電腦來說更有可能。