2013-09-26 133 views
2

我試圖編寫遠程服務器上應用程序和系統事件日誌過去30天的審查腳本,只查找警告,錯誤或關鍵條目。PowerShell:get-eventlog花費很長時間才能完成

從我發現這裏和其他論壇借用,我想出了:

$Date = Get-Date 
$Range = $Date.AddDays(-30) 
$Range = $range.ToShortDateString(); 
$LogName = Read-Host "Which Log? (Application, System)" 
$Server = Read-Host "Please Enter Server Name" 

get-eventlog $LogName -ComputerName $Server -After $range | where {$_.EntryType -eq "Error" -or $_.EntryType -eq "Warning" -or $_.EntryType -eq "Critical"} 

這似乎相當迅速運行,但隨後恢復到之前掛起數(5-10 +)分鐘一個提示,如果它確實....

注:如果刪除代碼:

-After $range 

我可以簡單地打破輸出,CTRL-C和我每天收到的,但我而是按預期運行然後停止...

所以:關於如何消除這種掛起的任何想法?
我也接受關於如何使代碼更優雅(和更快)的想法! 而且我也不會介意的腳本都檢查應用程序和系統日誌,而無需運行兩次....

回答

2

使用上Get-EventLog-EntryType字符串數組參數比檢索整個事件日誌,然後過濾快得多與Where-Object

嘗試get-eventlog -Logname System -EntryType ("Error", "Warning")

但是...如果我的-EntryType陣列中把「批判」,我得到:The argument "Critical" does not belong to the set "Error,Information,FailureAudit,SuccessAudit,Warning" specified by the ValidateSet attribute.這使我想知道你是否應該聽取的意見在Get-Help Get-EventLog上市:

只有在經典事件日誌中,包含EventLog名詞(EventLog cmdlet)的cmdlet才能工作 。要從使用Windows Vista中 Windows事件日誌技術的日誌中獲取事件並使用Windows的更高版本 ,請使用Get-WinEvent。

使用Get-WinEvent相反,我認爲這是你想要的東西: Get-Winevent -FilterHashtable @{LogName="System","Application"; Level=1,2,3; startTime=$range}

,將檢查1級,2或3(嚴重,錯誤,警告,分別)的事件,並同時搜索應用程序和系統日誌在同一個調用中。

2

我發現對於遠程系統,如果我將它包裝到一個Invoke-Command中,我可以使用相同的命令一次查詢多個系統。這是我的解決方案。系統越多,節省的時間就越多。 YMMV

$command = {Get-EventLog -LogName Application -After (Get-Date).AddHours("-24")} 
Invoke-Command -ComputerName "foo1","foo2","foo3","foo4" -ScriptBlock $command 
+0

請注意,Invoke-Command使用WSMAN/WinRM,需要在您的網絡上啓用,配置和打開端口。 – KERR

相關問題