Powershell,-filterhashtable和运营商

时间:2013-11-07 16:57:27

标签: powershell powershell-v2.0

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

2 个答案:

答案 0 :(得分:7)

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

... -FilterHashtable @{LogName='System';Level=0,1,3}

答案 1 :(得分:1)

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

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