Я фильтрую записи журнала событий с помощью командлета 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?
Похоже, решение Кейта Хилла работает. Сегодня узнал что-то новое, поэтому его ответ должен быть принят. –