我正在使用“Get-Winevent” cmdlet过滤事件日志条目。我想获取小于4的事件(或LevelName不是“Informational”的事件)。
我使用-filterhashtable标志来过滤事件。但是有没有办法与filterhashtable进行比较?还是只说“不”?还是filterhashtable仅接受“=”作为运算符?
这两个代码片段有效并获得相同的结果:
对象在哪里
$events = Get-WinEvent -computer ServerName -LogName System | Where-Object {$_.level -lt 4}
-filterhashtable
$events = Get-WinEvent -computer ServerName -FilterHashTable @{LogName = 'System'; Level = 1}
$events += Get-WinEvent -computer ServerName -FilterHashTable @{LogName = 'System'; Level = 2}
$events += Get-WinEvent -computer ServerName -FilterHashTable @{LogName = 'System'; Level = 3}
第二个代码段的运行速度比第一个代码段快得多(2分钟对16秒的运行时间)。据我了解,“where-object”必须等到“Get-WinEvent”获得每个事件对象(可能是数千个)之后。添加“-filterhashtable”会导致目标系统的事件日志被过滤,然后再将其提供给Get-WinEvent事件对象,这要快得多。
我可以合并这些陈述吗?这些片段不起作用:
$events = Get-WinEvent -computer ServerName -FilterHashTable @{LogName = 'System'; Level < 4}
$events = Get-WinEvent -computer ServerName -FilterHashTable @{LogName = 'System'; Level != 2}
“级别”属性的类型为“int [32]”,因此比较运算符应该起作用。实际上,它确实适用于“where-object”。但是,它不适用于“-filterhashtable”标志。没有办法进行这种比较吗?是唯一的-filterhashtable运算符接受“=”吗?
最佳答案
像这样的操作员没有骰子。 FilterXPath参数支持该功能。但是,关于FilterHashtable参数的帮助表明它接受一个int数组,因此它将接受:
... -FilterHashtable @{LogName='System';Level=0,1,3}
关于powershell - Powershell,-filterhashtable和运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19841953/