我正在使用“Get-Winevent”cmdlet过滤事件日志条目。我想获得级别小于4的事件(或者LevelName不是“信息”的事件)。
我使用-filterhashtable标志来过滤事件。但有没有办法与filterhashtable进行比较?或者只是把“不”?或者filterhashtable只接受“=”作为运算符吗?
这两个片段起作用并得到相同的结果:
where-object
$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}
“Level”属性的类型为“int [32]”,因此比较运算符应该起作用。实际上,它确实适用于“where-object”。但它不适用于“-filterhashtable”标志。有没有办法进行那种比较? “=”是唯一的运算符-filterhashtable接受吗?
答案 0 :(得分:7)
这样的运营商没有骰子。 FilterXPath参数支持该参数。但是,FilterHashtable参数的帮助表明它需要一个int数组,所以它接受:
... -FilterHashtable @{LogName='System';Level=0,1,3}
答案 1 :(得分:1)
不,你不能。哈希表是key = value
对的集合,因此它不允许关系运算符。
顺便说一句,在Powershell < is -lt
和> is -gt
。