Операторы сравнения в PowerShell
Эта статья описывает операторы, сравнивающие значения в PowerShell.
Операторы сравнения позволяют указать условия для сравнения значений и поиска значений, соответствующих указанным шаблонам. Чтобы использовать оператор сравнения, укажите значения, которые вы хотите сравнить, вместе с оператором, разделяющим эти значения.
PowerShell включает следующие операторы сравнения:
Тип | Операторы | Описание |
---|---|---|
Равенство | -eq | Равно |
-ne | Не равно | |
-gt | Больше чем | |
-ge | Больше чем или равно | |
-lt | Меньше чем | |
-le | Меньше чем или равно | |
Совпадение | -like | Возвращает true (истина), когда строка совпадает с шаблоном из подстановочных символов |
-notlike | Возвращает true (истина), когда строка НЕ совпадает с шаблоном из подстановочных символов | |
-match | Возвращает true (истина), когда строка совпадает с шаблоном регулярного выражения; переменная $matches содержит совпавшие строки | |
-notmatch | Возвращает true (истина), когда строка НЕ совпадает с шаблоном регулярного выражения; переменная $matches содержит совпавшие строки | |
Содержимое | -contains | Возвращает истину, если ссылочное значение содержится в коллекции |
-notcontains | Возвращает истину, если ссылочное значение НЕ содержится в коллекции | |
-in | Возвращает истину, если тестовое значение содержится в коллекции | |
-notin | Возвращает истину, если тестовое значение НЕ содержится в коллекции | |
Замена | -replace | Заменяет по шаблону строки |
Тип | -is | Возвращает истину, если оба объекта одного и того же типа |
-isnot | Возвращает истину, если оба объекта не одного и того же типа |
По умолчанию все операторы сравнения нечувствительны к регистру. Чтобы сделать оператор сравнения чувствительным к регистру, перед именем оператора поставьте «c». Например, версия -eq с учётом регистра — это -ceq. Чтобы сделать регистронезависимость явной, поставьте перед оператором «i». Например, явно нечувствительна к регистру версия -eq — это -ieq.
Если входными данными оператора является скалярное значение, операторы сравнения возвращают логическое значение. Когда ввод представляет собой набор значений, операторы сравнения возвращают любые совпадающие значения. Если в коллекции нет совпадений, операторы сравнения возвращают пустой массив.
(1, 2 -eq 3).GetType().FullName System.Object[]
Исключениями являются операторы Содержания, операторы In и операторы Типов, которые всегда возвращают значение типа BOOLEAN.
[! ПРИМЕЧАНИЕ] Если вам нужно сравнить значение с $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 #Не точное совпадение # Включён ли компьютер $ThisComputer в список компьютеров $DomainServers? $DomainServers -contains $thisComputer True "abc", "def", "ghi" -contains "abc", "def" False $a = "abc", "def" "abc", "def", "ghi" -contains $a False $a, "ghi" -contains $a True
-notcontains
Описание: Оператор содержимого. Сообщает, включает ли набор начальных значений одно тестовое значение. Всегда возвращает логическое значение. Возвращает ИСТИНА, если тестовое значение не является точным совпадением хотя бы с одним из начальных значений.
Когда тестовое значение является коллекцией, оператор -NotContains использует референтное равенство.
Синтаксис:
<Исходные-величины> -notcontains <Тестовая-величина>
Примеры:
"Windows", "PowerShell" -notcontains "Shell" True #Не точное совпадение # Получить параметры командлета, но исключить общие параметры function get-parms ($cmdlet) { $Common = "Verbose", "Debug", "WarningAction", "WarningVariable", "ErrorAction", "ErrorVariable", "OutVariable", "OutBuffer" $allparms = (Get-Command $Cmdlet).parametersets | foreach {$_.Parameters} | foreach {$_.Name} | Sort-Object | Get-Unique $allparms | where {$Common -notcontains $_ } } # Найдите неутвержденные глаголы в функциях моего модуля $ApprovedVerbs = Get-Verb | foreach {$_.verb} $myVerbs = Get-Command -Module MyModule | foreach {$_.verb} $myVerbs | where {$ApprovedVerbs -notcontains $_} ForEach Sort Tee Where
-in
Описание: Оператор -In. Сообщает, появляется ли тестовое значение в наборе начальных значений. Всегда возвращать как логическое значение. Возвращает ИСТИНА, только если тестовое значение точно соответствует хотя бы одному из начальных значений.
Когда тестовое значение является коллекцией, оператор -In использует референтное равенство. Он возвращает ИСТИНА только в том случае, если одно из начальных значений является тем же экземпляром объекта тестового значения.
Оператор -in был введен в PowerShell 3.0.
<Тестовое-значение> -in <Начальные-значения>
Примеры:
"def" -in "abc", "def" True "Shell" -in "Windows", "PowerShell" False #Нет точного совпадения "Windows" -in "Windows", "PowerShell" True #Точное совпадение "Windows", "PowerShell" -in "Windows", "PowerShell", "ServerManager" False #Используется референтное равенство $a = "Windows", "PowerShell" $a -in $a, "ServerManager" True #Используется референтное равенство # Включён ли компьютер $ThisComputer в список компьютеров $DomainServers? $thisComputer -in $domainServers True
-notin
Описание: Сообщает, появляется ли тестовое значение в наборе начальных значений. Всегда возвращает логическое значение. Возвращает ИСТИНА, если тестовое значение не является точным совпадением хотя бы с одним начальных значений.
Когда тестовое значение является коллекцией, оператор -notin использует реферетное равенство. Он возвращает ИСТИНА только в том случае, если одно из эталонных значений является тем же экземпляром объекта тестового значения.
Оператор -notin был введен в PowerShell 3.0.
Синтаксис:
<Тестовое-значение> -notin <Начальные-значения>
Примеры:
"def" -notin "abc", "def" False "ghi" -notin "abc", "def" True "Shell" -notin "Windows", "PowerShell" True #Нет точного совпадения "Windows" -notin "Windows", "PowerShell" False #Точное совпадение # Найдите неутвержденные глаголы в функциях моего модуля $ApprovedVerbs = Get-Verb | foreach {$_.verb} $MyVerbs = Get-Command -Module MyModule | foreach {$_.verb} $MyVerbs | where {$_ -notin $ApprovedVerbs} ForEach Sort Tee Where
Оператор замены
Оператор -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