Уже неоднократно в наших статьях встречались операторы сравнения, например, когда мы разбирали Where-Object. В этой статье мы наконец-то разберем их все, чтобы уже понять окончательно как работают эти операторы. Как ни странно, вас ожидает длиннопост.
Powershell — Операторы сравнения
Equal / -eq
Начнем с самого известного и часто встречающегося. Оператор equal. Он проводит сравнение сравнение двух выражений и определяет равны ли они. Давайте попробуем использовать его самым простым способом:
1 2 |
1 -eq 1 True |
Здесь все просто. Equal в своей сущности эквивалентен оператору = в других языках программирования. Рассмотрим более сложный пример и попробуем сравнить строки:
1 2 3 4 |
$a = "123" $b = 123 $a -eq $b True |
Здесь сложнее, казалось бы, переменные имеют разный тип с одинаковым значением. Разве не должно ли вернуться false? Нет, потому что equal ищет совпадения, а не проверяет тип данных. Оператором equal можно пользоваться в циклах. Например:
1 2 3 4 5 6 |
if ($a -eq $b) { "переменные равны" } else { "переменные неравны" } переменные равны |
В такой ситуации проверяется условие находящееся в скобках. Так как переменные по значениям не отличаются возвращается True и выполняется первый блок кода.
Not equal / -ne
Здесь все работает с точностью, да наоборот. Если переменные не равны, возвращается true, если равны возвращается false. Пример:
1 |
2 -ne 1 |
Думаю понятно. Применение такое же — любые логические сравнения. Перейдем к следующему оператору.
Greater than or equal / -ge
Этот оператор вычисляет равно или больше левое выражение правому. Здесь важно понимать логику. Если выражение слева равно правому, возвращается True. Если выражение слева больше, возвращает тоже True. Тоже самое работает и в обратную сторону. То есть если выражение слева, меньше возвращается false. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
if (3 -ge 2) { "выражение слева больше или равно" } else { "выражение слева меньше" } выражение слева больше или равно if (2 -ge 2) { "выражение слева больше или равно" } else { "выражение слева меньше" } выражение слева больше или равно if (2 -ge 3) { "выражение слева больше или равно" } else { "выражение слева меньше" } выражение слева меньше |
Надеюсь с этим разобрались. Опять же, применение такое же, как и у операторов выше.
Greater Than / -gt
Этот оператор вычисляет больше ли левое выражение, чем правое или нет. Эквивалентен оператору > в других языках программирования. Что интересно, если попробовать выяснить одинаковые ли значения по обе стороны от оператора, то вернется false. Этот оператор не сравнивает, а выясняет больше или нет. Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
if (3 -gt 2) { "выражение слева больше" } else { "выражение слева меньше" } выражение слева больше if (3 -gt 4) { "выражение слева больше" } else { "выражение слева меньше" } выражение слева меньше if (3 -gt 3) { "выражение слева больше" } else { "выражение слева меньше" } выражение слева меньше |
Less Than / -lt
Противоположность Greater Than. Выясняет меньше ли левое значение, чем правое. Возвращает True, если левое выражение меньше, и false, если левое выражение больше. Например:
1 2 3 4 5 |
1 -lt 2 True 3 -lt 2 False |
Less than or equal / -le
Меньше или равно. Противоположность оператору Greater than or equal. Возвращает значение True, если левое выражение меньше или равно, чем правое. Возвращает false, если левое выражение больше, чем правое. Пример:
1 2 3 4 5 6 7 8 |
3 -le 2 False 1 -le 2 True 2 -le 2 True |
Все это были простые логические операторы. Теперь перейдем к более сложным.
Wildcard comparison / -like
Допустим у вас есть выборка сервисов, из которых вам нужен только единственный. Из его названия вы знаете только часть. В таком случае на помощь приходит оператор -like. В той же статье, про оператор Where мы использовали его. Like ищет соответствия в исходной строке, и выводит все, которые полностью или частично подходят:
1 |
get-service | Where Name -like "search" |
Обратите внимание, сейчас вывода никакого не последовало. В такой конструкции like будет искать исключительно точные совпадения. Чтобы найти все неточные, нужно поставить звездочки вокруг целевого имени:
1 2 3 4 5 |
get-service | Where Name -like "*search*" Status Name DisplayName ------ ---- ----------- Running WSearch Windows Search |
Еще пример:
1 2 3 4 5 6 7 8 9 10 |
ls | Where Name -like "D*" Каталог: C:\Users\Дом Mode LastWriteTime Length Name ---- ------------- ------ ---- d-r--- 29.01.2020 19:51 Desktop d-r--- 18.01.2020 20:38 Documents d-r--- 27.01.2020 19:15 Downloads |
Обратный Wildcard comparison / -notlike
Этот оператор работает наоборот. Ищет все несовпадения. Допустим нам нужны файлы где нет буквы D:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
ls | Where Name -notlike "*D*" Каталог: C:\Users\Дом Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 26.08.2019 21:04 .config d----- 26.08.2019 21:38 .nuget d----- 18.01.2020 20:39 .oracle_jre_usage d----- 26.08.2019 18:58 .templateengine d----- 26.08.2019 18:56 .vsts d----- 26.08.2019 20:02 .WebStorm2019.1 d----- 30.11.2019 20:10 ansel d-r--- 17.11.2019 11:30 Contacts d-r--- 17.11.2019 11:30 Favorites d-r--- 17.11.2019 11:30 Links d-r--- 17.11.2019 11:30 Music d-r--- 17.11.2019 11:30 Pictures d-r--- 17.11.2019 11:30 Searches d----- 26.08.2019 21:09 WebstormProjects -a---- 24.09.2019 21:24 121 .yarnrc -a---- 26.08.2019 21:08 90 yarn.lock |
Получаем соответствующий вывод.
Regular expression comparison / -match
Оператор match может быть использован по-разному. Например так:
1 2 3 4 5 |
"powershell" <strong>-match</strong> "power" True "powershell" <strong>-match</strong> "powerstring" False |
Или вот так:
1 2 3 4 5 6 7 8 9 |
$WMI = Get-WmiObject -List | Where-Object {$_.name <strong>-Match</strong> "network"} $WMI NameSpace: ROOT\cimv2 Name Methods Properties ---- ------- ---------- Win32_NetworkLoginProfile {} {AccountExpires, AuthorizationFlags, BadPasswordCount, Capt... Win32_NetworkAdapterConfiguration {EnableDHCP, Rene... {ArpAlwaysSourceRoute, ArpUseEtherSNAP, Caption, DatabasePa... Win32_NetworkAdapterSetting {} {Element, Setting} |
Обратный Regular expression comparison / -notmatch
Оператор -notmatch делает все наоборот, если совпадений выводится True и False, если совпадения есть. Пример:
1 2 |
"powershell" -notmatch "powerstring" True |
Есть еще операторы -replace, -contains и -not-contains. Но их мы рассмотрим позднее.
Так же есть операторы проверяющие принадлежность переменной к типу -is, -isnot и -as. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$a="123" $b=123 $a -is "Int" False $a -is "String" True $b -is "String" False $b -is "Int" True $b -as "Int" 123 $b -as "Bool" True $b -isnot "Bool" True $b -isnot "String" True $b -isnot "Int" False |
Оператор -as представляет выражение в типе, который вы ему укажете.
1 2 3 4 5 6 7 8 |
$b -as "Int" 123 $b -as "String" 123 $b -as "Boolean" True |
Итог
В данной статье мы рассмотрели все операторы сравнения в powershell. В следующих двух мы выделим для операторов -replace, -contains и -notcontains, а так же -and, -or, -not, xor и !. Надеюсь данная статья была для вас полезной! Если у вас остались вопросы, тогда пишите их в комментариях, ответим на все. Подписывайтесь на нашу группу в ВК, канал на ютубе, а так же канал в телеграме! Благодарим за проявленный интерес.