Операторы сравнения Powershell
В данной статье мы рассмотрим не только операторы сравнения Powershell, но и операторы замены, логические операторы. Сравнивать можно не только данные с типом строка или число, но и дата, булево и т.п.
В Powershell используются операторы сравнения на основе букв, что поначалу не привычно. Очень хочется написать знак > вместо -gt или знак = вместо -eq. Но со временем к такому именованию привыкаешь. Перед оператором сравнения или логическим оператором обязательно нужно ставить знак –
Операторы сравнения
Оператор | Значение | Описание |
---|---|---|
-eq | Equal | Равно |
-ne | Not equal | Не равно |
-gt | Greater than | Больше |
-ge | Greater than or equal | Больше или равно |
-lt | Less than | Меньше |
-le | Less than or equal | Меньше или равно |
-like | Wildcard comparison | Используется подстановка символов для поиска по шаблону |
-notlike | Wildcard comparison | Используется подстановка символов для поиска не соответствия указанному шаблону |
-match | Regular expression comparison | Использование регулярных выражений для поиска по шаблону |
-notmatch | Regular expression comparison | Использование регулярных выражений для поиска не соответствия указанному шаблону |
-contains | Containment operator | Определяет, содержит ли значение слева от оператора значение справа |
-notcontains | Containment operator | Определяет, что значение слева от оператора не содержит значение оператора справа |
-in | Containment operator | Возвращает true если искомое значение содержится в коллекции |
-notin | Containment operator | Возвращает true если искомое значение не содержится в коллекции |
-replace | Replace operator | Заменяет часть или все значение слева от оператора |
-is | Type | Возвращает true если оба объекта одинаковы |
-isnot | Type | Возвращает true если оба объекта разные |
По умолчанию все операторы сравнения нечувствительны к регистру. Чтобы сделать оператор сравнения чувствительным к регистру, перед именем оператора поставьте букву c. К примеру, чувствительной к регистру оператор -eq пишется как -ceq. Чтобы сделать нечувствительность к регистру явной, перед оператором ставится i. К примеру, явно нечувствительная к регистру версия оператора -eq это -ieq.
Когда входные данные для оператора являются скалярным значением (число), операторы сравнения возвращают логическое значение. Если входные данные представляют собой набор значений, операторы сравнения возвращают любые совпадающие значения. Если в коллекции нет совпадений, операторы сравнения возвращают пустой массив. Исключение составляют операторы contains, notcontains, in, notin, is, isnot которые всегда возвращают логическое значение.
1, 2, 4, 8 -eq 2
1, 2, 4, 8 -eq 3
В первом варианте при сравнении набора чисел с 2 такое число есть в массиве. Во втором варианте при сравнении с 3 возвращается пустой массив, такого числа нет.
Операторы равенства
Операторы равенства (-eq, -ne) возвращают значение TRUE или совпадения, когда одно или несколько входных значений идентичны указанному шаблону. Шаблон должен полностью соответствовать значению.
Рассмотрим несколько простых примеров
20 -eq 20
21 -eq 20
"Проверка" -eq "Проверка"
"Проверка" -eq "Проверка не прошла"
"Test_ne" -ne "Test"
Сравним между собой две даты.
(Get-Date) -eq [datetime]("09.15.2020")
(Get-Date).Date -eq [datetime]("09.15.2020")
Давайте посмотрим на окошко вывода и разберемся что произошло. В первой строке я воспользовался командлетом Get-Date для получения текущей даты и времени. И сравнил его со строкой преобразованной в дату. Однако результат сравнения отрицательный т.е. False. Как видно число полностью совпадает, но, не совпадает время. Поэтому я взял командлет Get-Date и вывел из него только текущую дату (в таком случае время устанавливается в 0). И уже второй строкой результат сравнения положительный.
Давайте посмотрим на следующий пример который наверняка пригодится в хозяйстве. Мы будем искать файлы больше определенного размера.
Get-ChildItem -Path c:\ -Recurse|Where-Object {$_.Length -ge 40000000}
Итак, командлетом Get-ChildItem я хочу вывести список всех файлов и папок на диске C включая подпапки. Далее отправляя по конвееру командлету Where-Object я фильтрую вывод, чтобы показывались только файлы больше или равные (оператор -ge) 40 Мбайт. Как видите очень удобный инструмент получается. Особенно в качестве автоматизации чистки логов.
Операторы сопоставления
Операторы сопоставления (-like и -notlike) находят элементы, которые соответствуют или не соответствуют заданному шаблону, используя подстановочные выражения.
Рассмотрим на примере списка запущенных процессов. Получим список запущенных процессов firefox
Get-Process|Where-Object {$_.ProcessName -like "fire*"}
Командлетом Where-Object я выбрал из списка процессов (при помощи оператора -like) все с названием fire и дальше любые символы (*-любое кол-во символов)
Очень удобная конструкция. Всегда её использую для поиска необходимых процессов.
Операторы соответствия
Операторы соответствия (-match и-notmatch) находят элементы, которые соответствуют или не соответствуют заданному шаблону, используя регулярные выражения.
Оператор сопоставляет строку с помощью регулярных выражений. Если данные на входе являются скалярными, они заполняют автоматическую переменную $Matches. Если входными данными является коллекция, операторы -match и -notmatch возвращают соответствующие члены этой коллекции, но при этом, оператор не заполняет переменную $Matches.
Перейдем к примерам
"Вася","Петя","Маша" -match "маш"
$Matches
"Маша" -match "маш"
$Matches
В случае сравнения с одной строкой -match возвращает логическое значение и заполняет автоматическую переменную $Matches. Автоматическая переменная $Matches – это хэш-таблица. Если группировка или захват не используются, заполняется только один ключ. Клавиша 0 представляет весь текст, который был сопоставлен.
Операторы сдерживания
Операторы сдерживания (-contains и -notcontains) аналогичны операторам равенства. Только операторы сдерживания всегда возвращают логическое значение, даже если входными данными является коллекция.
В отличие от операторов равенства, операторы сдерживания возвращают значение, как только они обнаруживают первое совпадение. Операторы равенства оценивают все входные данные, а затем возвращают все совпадения в коллекции.
Посмотрим на практике
"Вася","Петя","Маша" -contains "маш"
"Вася","Петя","Маша" -contains "маша"
Как видно из примера, в случае не полного совпадения имени результат False. Если имя совпадает результат True.
Оператор -in указывает, появляется ли тестовое значение в коллекции эталонных значений. Всегда возвращает логическое значение. Возвращает TRUE только в том случае, если тестовое значение точно соответствует хотя бы одному из эталонных значений. Когда тестовое значение является коллекцией, оператор -in использует ссылочное равенство. Он возвращает TRUE только в том случае, если одно из опорных значений является тем же экземпляром объекта. Оператор -in был введен в PowerShell 3.0
Примеры
"Лада" -in "УАЗ", "ЛадаКалина"
"Лада" -in "Лада", "ЛадаКалина"
Оператор замены
Оператор замены (-replace) заменяет все или часть значения указанным значением с помощью регулярных выражений. Оператор -replace можно использовать для многих административных задач, таких как переименование файлов, замена текста в файле и прочее.
Рассмотрим пример по массовому переименованию файлов *.log в *.bak
Get-ChildItem *.log | Rename-Item -NewName { $_.name -replace '\.log$','.bak' }
И немного простых примеров с текстом
"Привет" -replace "ив",""
"Вася" -ireplace "я", "О"
"Насталя заря коммунизма" -replace "заря","эра"
Мы закончили рассматривать операторы сравнения Powershell. Теперь рассмотрим логические операторы.
Логические операторы Powershell
Оператор | Описание |
---|---|
-and | Оба условия должны быть истины, чтобы выражение было истинно |
-or | Одно или оба условия должны быть истины, чтобы выражение было истинно |
-xor | Одно условие должно быть истинно, а второе должно иметь значение ложь, чтобы выражение было истинно |
-not | Указанные условия должны иметь значение ложь, чтобы выражение было истинно |
! | Указанное условие должно иметь значение ложь, чтобы выражение было истинно |
Логические операторы PowerShell соединяют выражения и операторы, позволяя использовать одно выражение для проверки нескольких условий.
Снова обратимся к примеру из жизни. Появилась у меня задача найти файлы определенного размера. А именно чтобы они были больше одного числа но меньше другого. Реализуем на Powershell
Get-ChildItem|Where-Object {$_.length -gt 30000 -and $_.Length -lt 40000}
В данном примере мы получили список файлов в папке Windows объемом больше 30 Кбайт но меньше 40 Кбайт.
Мы рассмотрели все операторы сравнения Powershell. Их более чем достаточно для любых задач.