其中“ AND”未按预期运行

时间:2019-04-29 21:55:06

标签: powershell

我正在使用Get-EventLog提取Windows事件日志,并删除不希望使用source和eventid作为标准的日志事件。当我使用where进行解析时,请注意这些值。例如,如果我这样做

$Events = Get-EventLog -ComputerName $computer -LogName Application 
$events | ft source, eventid

我看到以下内容:

Source                            EventID
------                            -------
AutoEnrollment                         34

如果我这样做:

$events |
    ?{($_.Source -ne "AutoEnrollment" -and $_.EventID -ne 14)} |
    ft source, eventid

结果为空,这使我感到困惑,因为事件ID显然不匹配。我希望如果我针对$_.eventid -ne 34进行评估,那么结果将不会显示该事件。早在2012年我在PowerShell 2上编写代码时,此方法就起作用了。现在在v5.1上,它无法正确评估。

我应该知道有什么变化吗?还是一开始我搞砸了?如果我做错了,那么关于如何说“哪里事件不符合指定条件作为一组条件”的任何建议都将显示,以便source = autoenrollment和eventid = 34出现,但是不会出现具有source = autoenrollment和eventid = 14的事件。

1 个答案:

答案 0 :(得分:0)

mjsqu的这两篇文章回答了这个问题:

es和@ MathiasR.Jessen的建议是正确的。 NOT(A和B)与NOT(A)和NOT(B)不同,等效于NOT(A)或NOT(B)。为什么这曾经在PS2上起作用,这很奇怪。 – mjsqu 21小时前

我会改写为

... |? {-not ($_.Source -eq "AutoEnrollment" -and $_.EventID -eq 14)}

...可以说更易读。