2013-12-17 110 views
0

我試圖格式化一個命令,該命令在服務器上搜索事件日誌中的某個特定字符串,但我希望它搜索嚴重,警告和錯誤日誌條目。在沒有if語句的情況下在Powershell中使用OR?

現在,我只知道如何使搜索一個錯誤類型或其他的,比如像這樣:

Get-EventLog -LogName Application -EntryType Error -Message *STRING* -Newest 5 | 
Format-List 

這下面沒有工作,但沿着什麼我行努力做到:

Get-EventLog -LogName Application | 
Where {$_.EntryType Error -or $_.EntryType Warning -or $_.EntryType Crital} -and -Message *STRING* -Newest 5 | 
Format-List 

這不工作,而不是處於PowerShell的非常嫺熟,我不太清楚我應該怎麼格式化這個命令。其他OR語句我已經找到了使用IF的例子,但我不明白爲什麼我需要一個IF語句。

回答

2

存在多個語法錯誤。

Get-EventLog -LogName Application | ? {$_.EntryType -eq "Error" -or $_.EntryType -q "Warning" -or $_.EntryType -eq "Crital" } | select -First 5 | fl 

那麼發生了什麼變化?大多數情況下,你已經錯過了下劃線和評估運營商, $.EntryType Error - >$_.EntryType -eq "Error"。另外,通過使用-Newest 5,您只能從事件日誌中只讀取前5個條目,而不管它們是否與過濾器匹配。通過使用select -First 5,挑選出五個第一匹配。

如果要包括與消息字符串過濾,一些括號加上它像這樣,

Get-EventLog -LogName Application | ? { ($_.EntryType -eq "Error" -or $_.EntryType -q "Warning" -or $_.EntryType -eq "Crital") -and $_.Message -like "SEARCHTERM" | select -First 5 | fl 
2

您不需要(也不應該)使用where-object過濾此。 Get-EventLog上的EntryType參數需要數組的值,因此您可以將多個條目類型傳遞給該cmdlet並在該處進行過濾。儘可能接近源地進行過濾,以獲得內存&的性能原因(特別是通過網絡連接)。

Get-EventLog -LogName Application -EntryType Error,Critical,Warning -Message *STRING* -erroraction silentlycontinue -Newest 5 | Format-List 

我不得不添加-erroraction silentlycontinue,因爲如果沒有一種或多種類型的項目,它會拋出一個錯誤。您也可以使用try/catch來捕獲錯誤。

+0

啊謝謝你!我也是不正確的沒有關鍵類型或錯誤(導致命令運行錯誤),所以最後的命令很好運行: Get-EventLog -LogName應用程序-EntryType錯誤,警告-Message * STRING *默默地繼續運行 - Newest 5 |格式列表 – vnat

相關問題