Удаление объектов из конвейера
В PowerShell часто создается и передается в конвейер большее количество объектов, чем требуется. Вы можете указать свойства определенных объектов для отображения с помощью Format-*
командлетов, но это не помогает с проблемой удаления всех объектов из дисплея. Вы можете отфильтровать объекты до конца конвейера, чтобы выполнять действия только в подмножестве первоначально созданных объектов.
В PowerShell есть командлет Where-Object
, который позволяет протестировать каждый объект в конвейере и передать его дальше, только если он удовлетворяет определенному условию теста. Объекты, которые не проходят тест, удаляются из конвейера. Условие теста передается в виде значения параметра FilterScript.
Выполнение простых тестов с помощью Where-Object
Значение FilterScript представляет собой блок сценария (одну или несколько команд PowerShell, заключенных в фигурные скобки ({}
)), который возвращает значение True или False. Эти блоки скриптов могут быть простыми, но их создание требует знания о другой концепции PowerShell, операторах сравнения. Оператор сравнения сравнивает элементы, расположенные с обеих сторон оператора. Запись операторов сравнения начинается знаком дефиса (-
), после которого следует имя оператора. Основные операторы сравнения работают, как правило, с любыми видами объектов. Более сложные операторы сравнения работают только с текстом или массивами.
Примечание.
По умолчанию операторы сравнения 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" |
содержит- | Содержит | 1,2,3 -contains 1 |
-notcontains | не содержит | 1,2,3 -notcontains 4 |
В блоках сценариев командлета Where-Object
для обращения к текущему объекту конвейера используется специальная переменная $_
. Ниже приведен пример использования этой переменной. Если в списке содержатся числа и требуется вернуть только те, которые меньше 3, в командлете Where-Object
можно настроить фильтр чисел:
1,2,3,4 | Where-Object {$_ -lt 3}
1
2
Фильтрация на основе свойств объекта
Так как переменная $_
ссылается на текущий объект конвейера, для выполнения проверок можно обратиться к ее свойствам.
Например, в инструментарии WMI можно просмотреть класс Win32_SystemDriver. В определенной системе может быть несколько сотен драйверов, но вам может потребоваться только определенный набор системных драйверов, например работающих. Для класса Win32_SystemDriver соответствующим свойством является State. Таким образом, фильтровать системные драйверы и выбирать только запущенные можно с помощью строки:
Get-CimInstance -Class Win32_SystemDriver |
Where-Object {$_.State -eq 'Running'}
В результате будет получен длинный список. Чтобы отфильтровать эти драйверы для выбора только таких, запуск которых выполняется автоматически, можно проверить значение StartMode:
Get-CimInstance -Class Win32_SystemDriver |
Where-Object {$_.State -eq "Running"} |
Where-Object {$_.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
...
Результат выполнения этой команды содержит много ненужных сведений, поскольку драйверы, запущенные в данный момент, уже известны. В действительности, из всех сведений на данном этапе требуется только имя и отображаемое имя. Следующая команда включает только эти два свойства, что дает более простые выходные данные:
Get-CimInstance -Class Win32_SystemDriver |
Where-Object {$_.State -eq "Running"} |
Where-Object {$_.StartMode -eq "Manual"} |
Format-Table -Property Name,DisplayName
Name DisplayName
---- -----------
AsyncMac RAS Asynchronous Media Driver
bindflt Windows Bind Filter Driver
bowser Browser
CompositeBus Composite Bus Enumerator Driver
condrv Console Driver
HdAudAddService Microsoft 1.1 UAA Function Driver for High Definition Audio Service
HDAudBus Microsoft UAA Bus Driver for High Definition Audio
HidUsb Microsoft HID Class Driver
HTTP HTTP Service
igfx igfx
IntcDAud Intel(R) Display Audio
intelppm Intel Processor Driver
...
В приведенной выше команде есть два Where-Object
элемента, но их можно выразить в одном Where-Object
элементе с помощью -and
логического оператора, как показано ниже.
Get-CimInstance -Class Win32_SystemDriver |
Where-Object {($_.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) |
PowerShell