我正在使用“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”会导致目标系统的事件日志在提供事件对象ot 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 接受吗?