В оболочке Windows PowerShell часто создается и передается на конвейер большее количество объектов, чем требуется. Чтобы указать свойства конкретного объекта, которые требуется отобразить, можно воспользоваться командлетом Format, но это не позволяет решить проблему удаления с экрана всех объектов. Может возникнуть необходимость отфильтровать объекты до достижения конца конвейера, чтобы выполнить те или иные действия только на подмножестве объектов, созданных изначально.

В оболочке Windows PowerShell имеется командлет Where-Object, позволяющий проверить каждый объект в конвейере и передать его дальше по конвейеру, только если объект удовлетворяет условиям проверки. Объекты, не прошедшие проверку, удаляются из конвейера. Условия проверки передаются в виде значения параметра Where-Object FilterScript .

Выполнение простых проверок с командлетом Where-Object

Значение FilterScript представляет собой блок скрипта — одну или несколько команд Windows PowerShell, заключенных в фигурные скобки {}, — результатом которого могут быть значения TRUE или FALSE. Такие блоки скриптов могут быть очень простыми, но для их создания требуется понимание другого основного понятия Windows PowerShell, а именно операторов сравнения. Оператор сравнения сравнивает элементы, расположенные с обеих сторон оператора. Запись операторов сравнения начинается знаком "-", после которого следует имя оператора. Основные операторы сравнения работают, как правило, с любыми видами объектов. Более сложные операторы сравнения работают только с текстом или массивами.

Примечание.

По умолчанию при работе с текстом в оболочке Windows PowerShell операторы сравнения нечувствительны к регистру.

Исходя из соображений синтаксического анализа, знаки, такие как <,> или "=", не используются в качестве операторов сравнения. Вместо этого операторы сравнения записываются в буквенной форме. Основные операторы сравнения перечислены в таблице ниже.

Оператор сравнения Тип свойства Пример (возвращает значение TRUE)

-eq

равно

1 -eq 1

-ne

не равно

1 -ne 2

-lt

меньше, чем

1 -lt 2

-le

меньше или равно

1 -le 2

-gt

больше, чем

2 -gt 1

-ge

больше или равно

2 -ge 1

-like

сравнение на совпадение с учетом подстановочного знака в тексте

"file.doc" -like "f*.do?"

-notlike

сравнение на несовпадение с учетом подстановочного знака в тексте

"file.doc" -notlike "p*.doc"

-contains

содержит

1,2,3 -contains 1

-notcontains

не содержит

1,2,3 -notcontains 4

В блоках скриптов командлета Where-Object для обращения к текущему объекту конвейера используется специальная переменная $_. Ниже приведен пример использования этой переменной. Если в списке содержатся числа и требуется вернуть только меньшие 3, в командлете Where-Object можно настроить фильтр чисел:

PS> 1,2,3,4 | Where-Object -FilterScript {$_ -lt 3}
1
2

Фильтрация данных, основанная на свойствах объектов

Поскольку переменная $_ обращается к текущему объекту конвейера, для выполнения проверок можно получить доступ к ее свойствам.

Например, в WMI можно просмотреть класс Win32_SystemDriver. В какой-то конкретной системе могут содержаться сотни системных драйверов, но для проверки необходим определенный набор системных драйверов — таких, которые запущены в данный момент. Если для просмотра объектов класса Win32_SystemDriver использовать командлет Get-Member (Get-WmiObject -Class Win32_SystemDriver | Get-Member -MemberType Property), можно увидеть, что свойство State принимает значение Running, когда драйвер запущен. Таким образом, фильтровать системные драйверы и выбирать только запущенные можно с помощью строки:

Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"}

В результате будет получен длинный список. Отфильтровать эти драйверы и выбирать только такие, запуск которых выполняется автоматически, можно проверкой значения свойства StartMode:

PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Auto"}

DisplayName : RAS Asynchronous Media Driver
Name		: AsyncMac
State	 : Running
Status	: OK
Started	 : True

DisplayName : Audio Stub Driver
Name		: audstub
State	 : Running
Status	: OK
Started	 : True

Результат выполнения этой команды содержит много ненужных сведений, поскольку драйверы, запущенные в данный момент, уже известны. В действительности, из всех сведений на данном этапе требуется отобразить только имя и отображаемое имя драйвера. Следующая команда включает только эти два свойства, что приводит к более простым выводимым данным:

PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Manual"} | Format-Table -Property Name,DisplayName

Name									DisplayName
----									-----------
AsyncMac								RAS Asynchronous Media Driver
Fdc									 Floppy Disk Controller Driver
Flpydisk								Floppy Disk Driver
Gpc									 Generic Packet Classifier
IpNat								 IP Network Address Translator
mouhid								Mouse HID Driver
MRxDAV								WebDav Client Redirector
mssmbios								Microsoft System Management BIOS Driver

Приведенная выше команда содержит два элемента Where-Object, но их можно объединить в один элемент Where-Object, используя знак "-" и логический оператор:

Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript { ($_.State -eq "Running") -and ($_.StartMode -eq "Manual") } | Format-Table -Property Name,DisplayName

Стандартные логические операторы перечислены в следующей таблице.

Логический оператор Значение Пример (возвращает значение TRUE)

-and

Логическое И; возвращает значение TRUE, если оба операнда принимают значение TRUE

(1 -eq 1) -and (2 -eq 2)

-or

Логическое ИЛИ; возвращает значение TRUE, если один из операндов принимает значение TRUE

(1 -eq 1) -or (1 -eq 2)

-not

Логическое НЕ; изменяет значение (TRUE или FALSE) на противоположное

-not (1 -eq 2)

!

Логическое НЕ; изменяет значение (TRUE или FALSE) на противоположное

!(1 -eq 2)