2013-11-07 2 views
1

Я фильтрую записи журнала событий с помощью командлета Get-Winevent. Я хочу получить события, уровень которых меньше 4 (или где LevelName не является «информационным»).Powershell, -filterhashtable и операторы

Я использую флаг -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} 

«Уровень» свойство имеет тип «ИНТ [32]», поэтому оператор сравнения должен работать. Фактически, он работает с «where-object». Но это не работает с флагом «-filterhashtable». Разве нет такого способа сравнения? Является ли «=» единственным оператором -filterhashtable?

+0

Похоже, решение Кейта Хилла работает. Сегодня узнал что-то новое, поэтому его ответ должен быть принят. –

ответ

6

Никаких кубиков на таких операторах. Параметр FilterXPath поддерживает это. Однако помощь по параметру FilterHashtable указывает, что он принимает массив int, поэтому он принимает:

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

Кажется законным. Ницца! :) –

+1

Да, я не понял, что значение хэш-таблицы может быть массивом, пока я не просмотрю справку. RTFM снова наносит удар. :-) –

1

Нет, вы не можете. Хэш-таблица представляет собой набор пар key = value, поэтому он не позволит реляционным операторам.

Btw, в Powershell < is -lt и > is -gt.

Смежные вопросы