В среде PowerShell можно объединять команды в конвейеры и использовать команду Where-Object для фильтрации объектов, переданных этому конвейеру. К примеру, в следующей инструкции объекты команды Get-ChildItem (для ссылки на нее используется псевдоним dir) передаются по конвейеру команде Where-Object (обращение к ней осуществляется с помощью псевдонима where), которая отфильтровывает все объекты каталога C:Windows, за исключением тех, что имеют размеры свыше 500 000 байт:

dir c:windows |
where {$_.length -gt 500000}

Обратите внимание, что команда Where-Object содержит выражение, заключенное в скобки ({ }). Это выражение означает, что текущее значение свойства Length должно превышать отметку 500 000. Значение свойства Length считывается с помощью строки $_.length. Символ $_ отсылает к текущему объекту конвейера, а строка .length извлекает значение свойства Length. Затем в выражении используется оператор сравнения -gt (greater than — более, чем). С его помощью значение свойства Length сопоставляется с числом 500 000.

Как в любом языке, в оболочке PowerShell имеется набор операторов, с помощью которых пользователь может создавать выражения для последующего применения в инструкциях. Выражение представляет собой блок кода, который обрабатывается оболочкой PowerShell; результат этой обработки определяет, какое действие будет выполнено. Так, в приведенной выше инструкции PowerShell определяет, является ли выражение Where-Object истинным или ложным. Когда выражение определяется как истинное — иными словами, когда значение свойства Length текущего объекта превышает показатель 500 000, этот объект передается далее по конвейеру и отображается в числе прочих выходных данных. Если же выражение определяется как ложное, т. е. если значение свойства Length текущего объекта не превышает значения 500 000, объект удаляется и не отображается в числе выходных данных.

В среде PowerShell имеется множество операторов, которые пользователь может включать в свои выражения. В этой статье рассматриваются многие из таких операторов, а также приводятся примеры, иллюстрирующие их использование. Кроме того, во врезке «Как отыскать свойства команды» разъясняется, как находить имена свойств, подобных тем, что использовались в выражениях с командой Where-Object в приведенных выше примерах.

Операторы сравнения

Как явствует из названия, операторы сравнения используются для сравнения значений. Когда в выражении указывается оператор сравнения, PowerShell сравнивает значение, расположенное слева от оператора, со значением, стоящим справа от него. Вспомним приведенный выше пример, где значение свойства Length сопоставлялось со значением 500 000. Как показано в табл. 1, в среде PowerShell реализовано множество операторов сравнения. Возьмем некоторые из них и посмотрим, как они работают.

Если в предыдущем примере возвращались объекты, длина которых превышала 500 000 байт, то следующая инструкция предписывает оболочке возвращать элементы длиной менее 500 000 байт:

dir c:windows |
where {$_.length -lt 500000}

Как мы видим, две инструкции отличаются друг от друга только одним: в них применяются разные операторы сравнения. Вместо оператора -gt в данном примере используется оператор -lt (less than — менее, чем).

По такой же схеме построены и другие операторы сравнения. В следующей инструкции используется оператор равенства -eq (equal to). С его помощью значение свойства Responding сопоставляется со строкой true и формируется список реагирующих на обращения процессов.

get-process |
where {$_.responding -eq «true»}

Для того чтобы выражение Where-Object имело значение true, необходимо, чтобы такое же значение имело свойство Responding. В результате, как показано на экране 1, возвращаются только реагирующие на обращения процессы.

По умолчанию все операторы сравнения нечувствительны к регистру символов. Если же вы хотите, чтобы в вашем коде не было и тени двусмысленности, можете перед оператором сравнения поставить букву «i» (и получить, например, оператор -ieq); иными словами, вы явным образом укажете, что данный оператор сравнения нечувствителен к регистру символов. Однако таким свойством он обладает по умолчанию, так что добавлять символ «i» необходимости нет.

Впрочем, любой оператор сравнения можно наделить чувствительностью к регистру символов; для этого нужно добавить к оператору сравнения букву «c» (после этого оператор равенства будет иметь вид -ceq). К примеру, инструкция

"True" -eq "true"

возвратит значение true, поскольку оператор не учитывает регистр клавиатуры, тогда как инструкция

"True" -ceq "true"

возвратит значение false, поскольку использованный в ней оператор чувствителен к регистру символов.

Я понимаю, что эти примеры весьма примитивны. При работе в среде Windows регистр символов часто вообще не имеет значения, ибо в именах файлов, процессов и других компонентов регистр клавиатуры не учитывается. Но когда пользователь лучше освоит среду PowerShell и научится формировать другие типы списков, в которых учет регистра символов имеет важное значение, умение наделять операторы чувствительностью к регистру может пригодиться.

Еще одна полезная функция PowerShell — возможность использования знаков подстановки. К примеру, если вы создаете выражение для сравнения значений и неизвестно точное имя одного из компонентов, в сравниваемом значении (т. е. в значении, расположенном после оператора) можно использовать знаки подстановки. В табл. 2 приводятся подстановочные знаки, поддерживаемые средой PowerShell.

Подстановочные знаки применяются при использовании операторов сравнения -like и -notlike. Отметим, что операторы -like и -notlike, а также -match -notmatch и -replace иногда именуются операторами поиска по шаблону. Предположим, к примеру, что нам нужно найти все выполняемые на компьютере процессы, имеющие отношение к Google. Мы можем с помощью оператора -like возвратить все процессы, созданные компаниями, названия которых включают строку google:

get-process |
where {$_.company -like "*google*"}

Подстановочный знак «звездочка» может не представлять ни одного символа или представлять один либо несколько символов, поэтому мы получим точные результаты вне зависимости от того, в каком именно виде сохраняет имя компании система Windows — как Google, Google Inc. или в каком-либо ином варианте. На экране 2 представлены результаты выполнения этой инструкции. Если бы вместо оператора -like мы использовали оператор -notlike, были бы возвращены все процессы, не имеющие отношения к компании Google.

Наряду с подстановочными символами PowerShell поддерживает регулярные выражения, базирующиеся на классах регулярных выражений Microsoft.NET Framework. Регулярные выражения формируются с помощью операторов-match и -notmatch. PowerShell обеспечивает всестороннюю поддержку регулярных выражений — столь же полную, как и языки.NET. По этой причине рассмотрение упомянутых выражений выходит за рамки нашего урока. Сведения о них даны в справочных файлах PowerShell — файлах about_regular_expression и about_comparison_ operators.

Логические операторы

До сих пор я рассказывал о том, как использовать в выражениях операторы сравнения. Применяя один из этих операторов, пользователь формулирует условие, при выполнении или невыполнении которого осуществляется то или иное действие. Но иногда возникает необходимость в использовании выражений, включающих в себя несколько условий. Иными словами, бывают ситуации, когда решение о том, следует ли совершать то или иное действие, принимается в зависимости от выполнения не одного, а нескольких условий.

Для осуществления нескольких сравнений в одном выражении нужно связать условия с помощью логических операторов. Логические операторы, описанные в табл. 3, указывают на то, какая логика должна быть использована при фиксировании выполнения либо невыполнения нескольких условий.

 

Рассмотрим работу логических операторов на конкретном примере. В следующей инструкции команда Get-Process используется для формирования списка выполняемых процессов:

Get-Process |
where {($_.handles -gt 500) `
–and ($_.pm -ne 0)}

В инструкции содержатся два условия — каждое из них заключено в скобки. Первое условие ($_.handles -gt 500) указывает, что число дескрипторов для данного процесса должно быть больше 500. Второе условие ($_.pm -ne 0) указывает, что объем выгружаемой памяти не должен быть равен 0. Два этих условия объединены логическим оператором -and. В результате все выражение (заключенное в фигурные скобки) будет истинным лишь при выполнении обоих условий. Как показано на экране 3, возвращаются лишь те процессы, которые удовлетворяют обоим условиям.

Теперь рассмотрим оператор -or. Следующая инструкция отличается от предыдущей лишь тем, что вместо оператора -and в ней используется оператор -or:

get-process |
where {($_.handles -gt 500) `
–or ($_.pm -ne 0)}

В этом случае тот или иной процесс будет возвращен при выполнении по крайней мере одного из заданных условий. Иначе говоря, либо значение счетчика дескрипторов процесса должно быть больше 500, либо размер выгружаемой памяти не должен равняться 0, либо, наконец, должны выполняться оба заданных условия. В результате, как показано на экране 4, возвращается гораздо больше процессов.

Если нужно указать, что заданное условие не должно выполняться, можно использовать логический оператор -not. Так, в следующей инструкции указывается, что число дескрипторов должно быть более 100, а название компании не должно быть равным Microsoft Corporation:

get-process |
where {($_.handles -gt 100) `
–and -not ($_.company -eq `
"Microsoft Corporation")}

Как показано на экране 5, эта инструкция возвращает все не имеющие отношения к Microsoft процессы.

Арифметические операторы

PowerShell допускает использование арифметических операторов для выполнения математических вычислений. В табл. 4 даются описания этих операторов и приводятся базовые примеры. Некоторые из этих операторов можно использовать не только для выполнения математических вычислений, но и для решения других задач. Так, оператор «+» можно применять для сцепления строковых значений:

 

"Use + to add two" +
" " + "strings together".

На экране 6 показаны результаты сцепления этих двух значений. Здесь же представлены результаты выполнения инструкции:

"abc" * 4

В данном случае оператор * используется для повторения строкового значения четыре раза. В результате возвращаются четыре копии значения, и эти значения сцеплены в одну строку.

Приведенные мною примеры арифметических операторов элементарны, ниже будут показаны более сложные примеры их использования. Цель нынешнего урока — дать читателям представление об арифметических операторах, достаточное для того, чтобы можно было начать работать с ними. Дополнительные сведения об этих типах операторов даны в справочном файле about_arithmetic_operators.

Перспективы

Итак, на этом уроке я рассказал о том, что PowerShell поддерживает ряд операторов, которые позволяют формировать выражения и выполнять вычисления. Но мы не рассмотрели все операторы. К примеру, в PowerShell используются знаки операции над битами и операторы присваивания, которые позволяют присваивать значения переменным. На следующих уроках я расскажу о многих из этих операторов. Пока же в справочных файлах PowerShell вы можете получить дополнительные сведения о тех операторах, с которыми уже познакомились.

Роберт Шелдон (contact@rhsheldon.com) — технический консультант и автор большого количества книг по технологиям Microsoft Windows и базам данных


Как отыскать свойства команды

В этой статье я использую выражения Where-Object и указываю несколько свойств команды, например Length и Handles. Вы можете применять команду Get-Member для получения элементов команды или объектов.

В отличие от команд Get-Command, Get-Content и Get-Help, описанных в статье «PowerShell. Урок 1», опубликованной в Windows IT Pro/RE № 3 за 2008 г., нельзя использовать команду Get-Member в предложении, подобном

Get-Member Get-Process

Для использования Get-Member необходимо вначале указать объект, элементы которого предстоит извлечь, передать этот объект по конвейеру и далее указать в Get-Member. Например, для просмотра элементов команды Get-Process, следует ввести

Get-Process | Get-Member

На экране выведены результаты этой последовательности команд. Обратите внимание на записи AliasProperty в столбце MemberType. В дополнение к обычным свойствам, PowerShell поддерживает свойства псевдонимов и свойства сценариев. Свойство псевдонима (AliasProperty) есть другое имя для обычного свойства. Например, свойство псевдонима Name относится к свойству ProcessName. Свойство сценария (ScriptProperty) — это свойство, значение которого есть результат работы сценария. Например, свойство Company генерирует сценарий, который извлекает свойство CompanyName, связанное с объектом указанного процессаt.

Дополнительная информация о команде Get-Member дана в файле подсказок Get-Member Help. Информацию обо всех поддерживаемых типах элементов можно найти по адресу: technet.microsoft.com/en-us/library/bb978568.aspx.

Экран