Сегодня мы рассмотрим операторы сравнения – это часть синтаксиса, без которой не обойдется, пожалуй, ни один сколь-нибудь хороший скрипт. Они могут применяться как для ветвлений сценариев, различных проверок, так и фильтрации вывода.
Операторы сравнения. Общая конструкция
Мы не будем останавливаться на описании алгоритмов ветвления. А будем считать, что у Вас уже есть хотя бы базовое представление об этом. И рассмотрим только реализацию этих алгоритмов непосредственно в powershell.
Перейдем к наиболее используемым операторам сравнения:
Описание | Оператор без учета регистра | с учетом регистра
Равно | -eq | -ceq
Не равно | -ne | -cne
Больше | -gt | -cgt
Меньше | -lt | -clt
Больше или равно | -ge | -cge
Меньше или равно | -le | -cle
Общая конструкция сравнения выглядит следующим образом:
Объект1 <Оператор сравнения> Объект2
Результатом сравнения двух и более объектов или их свойств в зависимости от условия является Истина или Ложь. В powershell эти значения содержатся в двух константах: $true и $false соответственно.
В качестве демонстрации рассмотрим следующие примеры:
"abcd" -eq "ABCD"
True
"abcd" -ceq "ABCD"
False
10 -lt 8
False
7 -ge 7
True
Операторы сравнения. Множественные критерии
Для более гибкого ветвления или фильтрации возможна проверка сразу нескольких условий. Для этого применяются булевы функции AND, NOT, OR, XOR или их комбинации.
Объект1 <Оператор сравнения> Объект2 -AND Объект3 <Оператор сравнения> Объект4 -OR Объект5 <Оператор сравнения> Объект6
Порядок проверки условий можно определять путем их заключения в круглые скобки. Рассмотрим пример:
3 -lt 5 -and 3 -eq 3 -or 6 -gt 2 True
3 -lt 5 -and (3 -eq 3 -or 6 -gt 2) False
Все, что мы сделали – добавили скобки, тем самым изменив порядок отработки условий. И результат перевернулся с ног на голову.
Фильтрация и проверки
Логические операторы позволяют производить фильтрацию набора объектов по заданному условию. В большинстве случаев для этих целей применяется командлет Where-Object. Но некоторые команды могут иметь специальный параметр -filter. Он позволяет осуществлять фильтрацию объектов еще на этапе формирования списка объектов, а не после пайпа (“|”). Подробнее о Where-Object ►
Командлет Where-Object всегда должен принимать какой-нибудь набор объектов, т.к. он служит именно для фильтрации. Как получить справку по команде, можно узнать здесь. Для примера получим список всех процессов браузера Chrome
и отфильтруем их по памяти и ЦПУ:
Get-Process chrome | Where-Object {$PSItem.CPU -gt 5 -and $PSItem.WS -gt 100000000}
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
351 20 116656 154096 13,53 3608 1 chrome
341 22 79636 122464 24,36 4284 1 chrome
2821 80 178392 283320 533,84 10492 1 chrome
307 21 92476 126928 8,27 12220 1 chrome
445 29 228544 268308 230,39 12608 1 chrome
239 15 141592 165592 53,23 12636 1 chrome
895 55 421084 249276 711,08 13040 1 chrome
Как мы видим командлет Where-Object содержит исполняемую часть, в которой и происходит проверка условий. Эта часть команды обозначается фигурными скобками. Но если фильтрация происходит только по одному условию, фигурные скобки можно опустить. Например:
Get-Service | Where-Object Status -eq "Running"
будет эквивалентно варианту
Get-Service | Where-Object {$_.Status -eq "Running"}
Переменная $PSItem означает текущий обрабатываемый объект. Так же она имеет более короткий и потому и более распространенный вариант – $_.
В процессе выполнения скрипта может возникать необходимость в проверке соответствия значения параметров объекта условиям. От которых может зависеть алгоритм дальнейшей работы скрипта. В такой ситуации так же применяются логические операторы, но уже с командлетами ветвления. Такими как If, Else и Switch, например.