Операторы сравнения в PowerShell
Эта статья описывает операторы, сравнивающие значения в PowerShell.
Операторы сравнения позволяют указать условия для сравнения значений и поиска значений, соответствующих указанным шаблонам. Чтобы использовать оператор сравнения, укажите значения, которые вы хотите сравнить, вместе с оператором, разделяющим эти значения.
PowerShell включает следующие операторы сравнения:
Тип | Операторы | Описание |
---|---|---|
Равенство | -eq (-ieq, -ceq) | Равно |
-ne (-ine, -cne) | Не равно | |
-gt (-igt, -cgt) | Больше чем | |
-ge (-ige, -cge) | Больше чем или равно | |
-lt (-ilt, -clt) | Меньше чем | |
-le (-ile, -cle) | Меньше чем или равно | |
Совпадение | -like (-ilike, -clike) | Возвращает true (истина), когда строка совпадает с шаблоном из подстановочных символов |
-notlike (-inotlike, -cnotlike) | Возвращает true (истина), когда строка НЕ совпадает с шаблоном из подстановочных символов | |
-match (-imatch, -cmatch) | Возвращает true (истина), когда строка совпадает с шаблоном регулярного выражения; переменная $matches содержит совпавшие строки | |
-notmatch (-inotmatch, -cnotmatch) | Возвращает true (истина), когда строка НЕ совпадает с шаблоном регулярного выражения; переменная $matches содержит совпавшие строки | |
Содержимое | -contains (-icontains, -ccontains) | Возвращает истину, если ссылочное значение содержится в коллекции |
-notcontains (-inotcontains, -cnotcontains) | Возвращает истину, если ссылочное значение НЕ содержится в коллекции | |
-in | Возвращает истину, если тестовое значение содержится в коллекции | |
-notin | Возвращает истину, если тестовое значение НЕ содержится в коллекции | |
Замена | -replace (-ireplace, -creplace) | Заменяет по шаблону строки |
Тип | -is | Возвращает истину, если оба объекта одного и того же типа |
-isnot | Возвращает истину, если оба объекта не одного и того же типа |
По умолчанию все операторы сравнения нечувствительны к регистру. Чтобы сделать оператор сравнения чувствительным к регистру, перед именем оператора поставьте «c». Например, версия -eq с учётом регистра — это -ceq. Чтобы сделать регистронезависимость явной, поставьте перед оператором «i». Например, явно нечувствительна к регистру версия -eq — это -ieq.
Сравнения строк используют InvariantCulture как для сравнений с учётом регистра, так и для сравнений без учёта регистра. Сравнения проводятся между кодовыми точками Unicode и не используют сортировку, зависящую от культуры. Результаты одинаковы независимо от текущей культуры.
В PowerShell скалярное значение — это любой тип значения, который не является перечислимым. Сюда входят примитивные типы .NET, такие как логические значения и числа, а также другие типы значений, такие как String, DateTime и Guid. Список примитивных типов .NET: Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double и Single. Упрощённо говоря, скалярное значение обычно сводится к строке, числу или булевому значению.
Когда левое значение в выражении сравнения является скалярным значением, оператор возвращает логическое значение. Когда левое значение в выражении является коллекцией, оператор возвращает элементы коллекции, которые соответствуют правому значению выражения. Правые значения всегда обрабатываются как экземпляры singleton, даже если они являются коллекциями. Операторы сравнения не могут эффективно сравнивать коллекции с коллекциями.
Если в коллекции нет совпадений, операторы сравнения возвращают пустой массив.
$a = (1, 2) -eq 3 $a.GetType().Name $a.Count
Вывод:
Object[] 0
Есть несколько исключений:
- Операторы Содержимое и Тип всегда возвращают логическое значение
- Оператор -replace возвращает результат замены
- Операторы -match и -notmatch также заполняют автоматическую переменную $Matches, если только левая часть выражения не является коллекцией.
[! ПРИМЕЧАНИЕ] Если вам нужно сравнить значение с $null, вы должны поместить $null в левую часть сравнения. Когда вы сравниваете $null с OBJECT[], результатом будет ЛОЖЬ, потому что объект сравнения является массивом.
Когда вы сравниваете массив с $null, сравнение отфильтровывает любые значения $null, хранящиеся в массиве. Например:
$null -ne $null, "hello" True $null, "hello" -ne $null hello
Операторы равенства
Операторы равенства (-eq, -ne) возвращают значение ИСТИНА или совпадения, когда одно или несколько входных значений идентичны указанному шаблону. Весь шаблон должен соответствовать целому значению.
Пример:
-eq
Описание: равно с. Включает идентичное значение.
Пример:
2 -eq 2 True 2 -eq 3 False 1,2,3 -eq 2 2 "abc" -eq "abc" True "abc" -eq "abc", "def" False "abc", "def" -eq "abc" abc
-ne
Описание: Не равно с. Включает отличное значение.
Примеры:
"abc" -ne "def" True "abc" -ne "abc" False "abc" -ne "abc", "def" True "abc", "def" -ne "abc" def
-gt
Описание: Больше чем.
Примеры:
8 -gt 6 True 7, 8, 9 -gt 8 9
[! ПРИМЕЧАНИЕ] Его не следует путать с «>», оператором «больше», который используется во многих других языках программирования. В PowerShell «>» используется для перенаправления. Для получения дополнительной информации смотрите «Как в PowerShell сохранить вывод в файл (аналоги > и >>)».
-ge
Описание: Больше или равно.
Примеры:
8 -ge 8 True 7, 8, 9 -ge 8 8 9
-lt
Описание: Менее чем.
Примеры:
8 -lt 6 False 7, 8, 9 -lt 8 7
-le
Описание: меньше или равно.
Примеры:
6 -le 8 True 7, 8, 9 -le 8 7 8
Операторы совпадения
Операторы похожести (-like и -notlike) находят элементы, которые соответствуют или не соответствуют указанному шаблону, используя выражения с подстановочными знаками.
Синтаксис:
<string[]> -like <выражение-с-подстановочными-знаками> <string[]> -notlike <выражение-с-подстановочными-знаками>
Смотрите также: Подстановочные символы в PowerShell
Операторы совпадения (-match и -notmatch) находят элементы, которые соответствуют или не соответствуют указанному шаблону, используя регулярные выражения.
Смотрите также: Регулярные выражения в PowerShell
Операторы совпадения заполняют автоматическую переменную $Matches, когда входные данные (левый аргумент) для оператора являются одним скалярным объектом. Когда вход является скалярным, операторы -match и -notmatch возвращают логическое значение и устанавливают значение автоматической переменной $Matches для совпавших компонентов аргумента.
Синтаксис:
<string[]> -match <регулярное-выражение> <string[]> -notmatch <регулярное-выражение>
-like
Описание: совпадение выражению с подстановочными знаками (*).
Примеры:
"PowerShell" -like "*shell" True "PowerShell", "Server" -like "*shell" PowerShell
-notlike
Описание: не совпадение выражению с подстановочными знаками (*).
Примеры:
"PowerShell" -notlike "*shell" False "PowerShell", "Server" -notlike "*shell" Server
-match
Описание: совпадает с регулярным выражением. Когда вход является скалярным, он заполняет автоматическую переменную $Matches.
Смотрите также: Регулярные выражения в PowerShell
Операторы совпадения ищут только по строкам. Они не могут искать в массивах целых чисел или других объектах.
Если входом является коллекция, операторы -match и -notmatch возвращают соответствующие элементы этой коллекции, но оператор не заполняет переменную $Matches.
Например, следующая команда отправляет набор строк оператору -match. Оператор -match возвращает совпадающие элементы в коллекции. Он не заполняет автоматическую переменную $Matches.
"Sunday", "Monday", "Tuesday" -match "sun" Sunday $Matches
Напротив, следующая команда отправляет одну строку оператору -match. Оператор -match возвращает логическое значение и заполняет автоматическую переменную $Matches. Автоматическая переменная $Matches является HASHTABLE. Если группировка или захват не используются, заполняется только один ключ.
"Sunday" -match "sun" True $Matches Name Value ---- ----- 0 Sun
Ключ 0 представляет весь совпавший текст. Дополнительные сведения о группировке и захвате с использованием регулярных выражений смотрите в разделе «Регулярные выражения в PowerShell».
Важно отметить, что хеш-таблица $Matches будет содержать только первое вхождение любого совпадению шаблона.
"Banana" -match "na" True $Matches Name Value ---- ----- 0 na
[!ВАЖНО] Ключ 0 — это ЦЕЛОЕ число. Вы можете использовать любой метод HASHTABLE для доступа к сохранённому значению.
"Good Dog" -match "Dog" True $Matches[0] Dog $Matches.Item(0) Dog $Matches.0 Dog
Оператор -notmatch заполняет автоматическую переменную $Matches, когда вход является скалярным, а результат равен False, то есть, когда он обнаруживает совпадение.
"Sunday" -notmatch "rain" True $matches "Sunday" -notmatch "day" False $matches Name Value ---- ----- 0 day
-notmatch
Описание: не соответствует строке. Использует регулярные выражения. Когда вход является скалярным, он заполняет автоматическую переменную $Matches.
Примеры:
"Sunday" -notmatch "sun" False $matches Name Value ---- ----- 0 sun "Sunday", "Monday" -notmatch "sun" Monday
Операторы содержимого
Операторы содержимого (-contains и -notcontains) аналогичны операторам равенства. Однако операторы содержимого всегда возвращают логическое значение, даже если ввод является коллекцией.
Кроме того, в отличие от операторов равенства, операторы содержимого возвращают значение, как только обнаруживают первое совпадение. Операторы равенства оценивают весь ввод, а затем возвращают все совпадения в коллекции.
-contains
Описание: Оператор содержимого. Сообщает, включает ли набор начальных значений одно тестовое значение. Всегда возвращает логическое значение. Возвращает ИСТИНА, только если тестовое значение точно соответствует хотя бы одному из начальных значений.
Когда тестовое значение является коллекцией, оператор -Contains использует ссылочное равенство. Он возвращает ИСТИНА только в том случае, если одно из начальных значений является тем же экземпляром объекта тестового значения.
В очень большой коллекции оператор -contains возвращает результаты быстрее, чем оператор равенства.
Синтаксис:
<Исходные-величины> -contains <Тестовая-величина>
Примеры:
"abc", "def" -contains "def" True "Windows", "PowerShell" -contains "Shell" False #Неточное совпадение
Более сложные примеры:
$DomainServers = "ContosoDC1","ContosoDC2","ContosoFileServer","ContosoDNS","ContosoDHCP","ContosoWSUS" $thisComputer = "ContosoDC2" $DomainServers -contains $thisComputer # Вывод: True
Если правый операнд является коллекцией, эти операторы преобразуют значение в его строковое представление перед сравнением с левой коллекцией.
$a = "abc", "def" "abc", "def", "ghi" -contains $a # Вывод: False # Все следующие выражения являются эквивалентом друг друга: $a, "ghi" -contains $a # Вывод: True "$a", "ghi" -contains $a # Вывод: True "abc def", "ghi" -contains $a # Вывод: True
-notcontains
Описание: Оператор содержимого. Сообщает, включает ли набор начальных значений одно тестовое значение. Всегда возвращает логическое значение. Возвращает ИСТИНА, если тестовое значение не является точным совпадением хотя бы с одним из начальных значений.
Когда тестовое значение является коллекцией, оператор -NotContains использует референтное равенство.
Синтаксис:
<Исходные-величины> -notcontains <Тестовая-величина>
Примеры:
"abc", "def" -notcontains "def" # Вывод: False "Windows", "PowerShell" -notcontains "Shell" # Вывод: True "abc", "def", "ghi" -notcontains "abc", "def" # Вывод: True
-in
Операторы -in и -notin были представлены в PowerShell 3 как синтаксическая противоположность операторам -contains и -notcontains. Проще говоря, при использовании операторов -contains и -notcontains КОЛЛЕКЦИЯ находится в левой части, а ТЕСТИРУЕМЫЙ-ОБЪЕКТ находится в правой части. У операторов -in и -notin расположение КОЛЛЕКЦИИ и тестируемого объекта противоположное.
Оператор -in возвращает True, когда левая часть ТЕСТИРУЕМОГО-ОБЪЕКТА соответствует одному из элементов КОЛЛЕКЦИИ. Вместо этого -notin возвращает False.
Всегда возвращает логическое значение.
Синтаксис:
ТЕСТИРУЕМЫЙ-ОБЪЕКТ -in КОЛЛЕКЦИЯ
Следующие примеры делают то же самое, что и примеры для -contains и -notcontains, но вместо тех операторов они написаны с использованием -in и -notin.
"def" -in "abc", "def" # Вывод: True "Shell" -in "Windows", "PowerShell" # Вывод: False "abc", "def" -in "abc", "def", "ghi" # Вывод : False
Более сложные примеры:
$DomainServers = "ContosoDC1","ContosoDC2","ContosoFileServer","ContosoDNS", "ContosoDHCP","ContosoWSUS" $thisComputer = "ContosoDC2" $thisComputer -in $DomainServers # Вывод: True
Если левым операндом является коллекция, эти операторы преобразуют значение в его строковое представление перед сравнением с правой коллекцией.
$a = "abc", "def" $a -in "abc", "def", "ghi" # Вывод: False # Все следующие выражения эквиваленты друг другу: $a -in $a, "ghi" # Вывод: True $a -in "$a", "ghi" # Вывод: True $a -in "abc def", "ghi" # Вывод: True
-notin
-notin возвращает False, когда левая часть ТЕСТИРУЕМОГО-ОБЪЕКТА соответствует одному из элементов КОЛЛЕКЦИИ.
Синтаксис:
ТЕСТИРУЕМЫЙ-ОБЪЕКТ -notin КОЛЛЕКЦИЯ
Примеры -notin:
"def" -notin "abc", "def" # Вывод: False "Shell" -notin "Windows", "PowerShell" # Вывод: True "abc", "def" -notin "abc", "def", "ghi" # Вывод: True
Оператор замены
Оператор -replace заменяет все или часть значения указанным значением с помощью регулярных выражений. Вы можете использовать оператор -replace для многих административных задач, таких как переименование файлов. Например, следующая команда изменяет расширения имён всех файлов .txt на .log:
Get-ChildItem *.txt | Rename-Item -NewName { $_.name -replace '\.txt$','.log' }
Синтаксис оператора -replace следующий, где заполнитель ОРИГИНАЛ представляет символы, которые нужно заменить, а заполнитель ЗАМЕНА представляет символы, которые их заменят:
ВВОД -replace ОРИГИНАЛ, ЗАМЕНА
По умолчанию оператор -replace не чувствителен к регистру. Чтобы сделать его чувствительным к регистру, используйте -creplace. Чтобы сделать это явно нечувствительным к регистру, используйте -ireplace.
Рассмотрим следующие примеры:
"book" -replace "B", "C" Cook "book" -ireplace "B", "C" Cook "book" -creplace "B", "C" book
Также можно использовать регулярные выражения для динамической замены текста с помощью групп захвата и подстановок. Для получения дополнительной информации смотрите «Регулярные выражения в PowerShell».
Подстановки ScriptBlock
Начиная с PowerShell 6, вы можете использовать аргумент SCRIPTBLOCK для текста _Substitution_. Блок SCRIPTBLOCK будет выполняться для каждого совпадения, найденного в строке _input_.
В SCRIPTBLOCK используйте автоматическую переменную $_ для ссылки на текущий объект SYSTEM.TEXT.REGULAREXPRESSIONS.MATCH. Объект MATCH даёт вам доступ к текущему заменяемому тексту ввода, а также к другой полезной информации.
В этом примере каждая последовательность из трёх десятичных знаков заменяется символьным эквивалентом. SCRIPTBLOCK запускается для каждого набора из трёх десятичных знаков, которые необходимо заменить.
"072101108108111" -replace "\d{3}", {[char][int]$_.Value} Hello
Сравнение типов
Операторы сравнения типов (-is и -isnot) используются для определения того, является ли объект определенным типом.
-is
Синтаксис:
<объект> -is <исходный объект>
Пример:
$a = 1 $b = "1" $a -is [int] True $a -is $b.GetType() False
-isnot
Синтаксис:
<объект> -isnot <исходный объект>
Пример:
$a = 1 $b = "1" $a -isnot $b.GetType() True $b -isnot [int] True
Что-то автор налабудил в примерах.
С операторами содержимого работает только точное совпадение.