1

我正在使用“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 接受吗?

4

2 回答 2

10

像这样的运营商没有骰子。FilterXPath 参数支持这一点。但是,FilterHashtable 参数的帮助表明它需要一个 int 数组,因此它可以接受:

... -FilterHashtable @{LogName='System';Level=0,1,3}
于 2013-11-07T17:20:07.610 回答
1

不,你不能。哈希表是对的集合key = value,因此它不允许关系运算符。

顺便说一句,在 Powershell< is -lt> is -gt.

于 2013-11-07T17:09:55.783 回答