Поделиться через


Удаление объектов из конвейера

В 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)