В оболочке 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) |