Найти тему
ProPowershell.ru

Основы Powershell. Операторы сравнения или логические операторы

Оглавление

Сегодня мы рассмотрим операторы сравнения – это часть синтаксиса, без которой не обойдется, пожалуй, ни один сколь-нибудь хороший скрипт. Они могут применяться как для ветвлений сценариев, различных проверок, так и фильтрации вывода.

Операторы сравнения. Общая конструкция

Мы не будем останавливаться на описании алгоритмов ветвления. А будем считать, что у Вас уже есть хотя бы базовое представление об этом. И рассмотрим только реализацию этих алгоритмов непосредственно в 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

Процессы Chrome
Процессы 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, например.

Наука
7 млн интересуются