问题从输出中过滤掉某些事件日志

时间:2015-06-16 15:04:54

标签: html powershell

所以我编写了一个小脚本,它在一个漂亮的HTML电子邮件中向我发送了我的服务器的最后24小时事件日志,以节省我必须登录到每个服务器等等。除了我们的一些应用程序生成我想要过滤掉的大量事件。

我设法使用where语句来过滤掉一个,但是当我尝试添加另一个事件ID时,它无法按预期工作。

我的代码片段如下:

$ApplicationEventsReport = @()
$ApplicationEvents = Get-EventLog -ComputerName $computer -LogName Application -EntryType Error,Warning -After (Get-Date).AddDays(-1) | where {$_.EventID -ne 1530}

foreach ($event in $ApplicationEvents) {
        $row = New-Object -Type PSObject -Property @{
                TimeGenerated = $event.TimeGenerated
                EntryType = $event.EntryType
                Source = $event.Source
                Message = $event.Message
                EventID = $event.InstanceID
        }
        $ApplicationEventsReport += $row
}

$ApplicationEventsReport = $ApplicationEventsReport | ConvertTo-Html -Fragment

你会注意到在get-eventlog行的末尾有一个where部分,如果有意义的话,那就是ID。

我试图通过以下方式添加另一个:

where {$_.EventID -ne 1530 -or $_.EventID -ne 3221229571}

where {($_.EventID -ne 1530) -or ($_.EventID -ne 3221229571)}

where {$_.EventID -ne 1530} | where {$_.EventID -ne 3221229571}

where {$_.EventID -ne 1530} -or {$_.EventID -ne 3221229571}

然而,这些都不能完全忽略它,或者只处理第一个(1530年)......

关于为什么会失败的任何想法,如果我在我的机器上本地运行这一行,它们似乎都能正常工作一旦我回到脚本中它似乎只会失败?

1 个答案:

答案 0 :(得分:1)

我想我看到了几个潜在的问题。如果我们从本地计算机上看一些事件。

EventID InstanceId Message                                                                                                                                   
------- ---------- -------                                                                                                                                   
   1202 2147484850 Security policies were propagated with warning....                                                                                        
      0          0 The description for Event ID '0' in Source 'gupdate' cannot be found.  The local computer may not have the necessary registry informati...
   1001       1001 Fault bucket , type 0...                                                                                                                  
   1001       1001 Fault bucket , type 0...                                                                                                                  
   1003 1073742827 The Software Protection service has completed licensing status check....                                                                  
   1202 2147484850 Security policies were propagated with warning....                                                                                        
     32 1073741856 The store ...                                        
     32 1073741856 The store   ....

我看到的数字与您的相似,但 instanceID 。所以一个简单的改变就是这样的。

Where-Object {$_.EventID -ne 1530 -and $_.InstanceID -ne 3221229571}

您应该使用-and,因为如果要过滤的记录仅匹配其中一个条件,则使用-or可能会导致问题。

如果要过滤大量记录,则可以将值存储在数组中,以便在Where子句中使用。

$eventsToIgnore = "1004","1500","10001"
$instanceIDsToIgnore = "3221229571","2147484850"

#.... blah blah... other stuff

Where-Object {$eventsToIgnore -notcontains $_.EventID -and $instanceIDsToIgnore -notcontains $_.InstanceID}