在没有if语句的情况下在Powershell中使用OR?

时间:2013-12-17 13:36:50

标签: powershell

我正在尝试格式化在服务器上搜索特定字符串的事件日志的命令,但我希望它搜索严重,警告和错误日志条目。

现在,我只知道如何让它搜索一种错误类型或另一种,例如:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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来捕获错误。