О операторах сравнения
Краткое описание
Описывает операторы, сравнивающие значения в PowerShell.
Подробное описание
Операторы сравнения позволяют указать условия для сравнения значений и поиска значений, соответствующих указанным шаблонам. Чтобы использовать оператор сравнения, укажите значения, которые необходимо сравнить вместе с оператором, разделяющим эти значения.
PowerShell включает следующие операторы сравнения:
Тип | Операторы | Описание: |
---|---|---|
Равенство | -eq | equals (равно) |
-ne | не равно | |
-gt | больше чем | |
-ge | больше или равно | |
-lt | меньше чем | |
-le | меньше или равно | |
Matching | -like | Возвращает значение true, если строка совпадает с подстановочным знаком |
pattern | ||
-notlike | Возвращает значение true, если строка не соответствует | |
Шаблон подстановочных знаков | ||
-match | Возвращает значение true, если строка соответствует регулярному выражению | |
шаблон; $matches содержит соответствующие строки | ||
-notmatch | Возвращает значение true, если строка не соответствует | |
шаблон регулярных выражений; $matches содержит сопоставление | ||
строки; | ||
Containment | -contains | Возвращает значение true, если значение ссылки содержится |
в коллекции | ||
-notcontains | Возвращает значение true, если значение ссылки отсутствует | |
содержится в коллекции | ||
-in | Возвращает значение true, если значение теста, содержащееся в объекте a | |
коллекция | ||
-notin | Возвращает значение true, если значение теста не содержится | |
в коллекции | ||
Замена | -replace | Заменяет шаблон строки |
Тип | -is | Возвращает значение true, если оба объекта одинаковы |
тип | ||
-isnot | Возвращает значение true, если объекты не совпадают | |
тип |
По умолчанию все операторы сравнения не учитывают регистр. Чтобы сделать оператор сравнения с учетом регистра, предшествуйте имени оператора с помощью c
. Например, версия с учетом регистра -eq
имеет значение -ceq
. Чтобы сделать регистр нечувствительной явной, предшествуйте оператору с параметром i
. Например, версия без учета регистра -eq
явно не учитывается -ieq
.
Если входные данные оператора являются скалярным значением, операторы сравнения возвращают логическое значение. Если входные данные являются коллекцией значений, операторы сравнения возвращают все совпадающие значения. Если в коллекции нет совпадений, операторы сравнения возвращают пустой массив.
PS> (1, 2 -eq 3).GetType().FullName
System.Object[]
Исключением являются операторы сдерживания, операторы In и операторы типа, которые всегда возвращают логическое значение.
Примечание
Если необходимо сравнить значение с $null
вами, следует поместить $null
в левую сторону сравнения. При сравнении $null
с object[] результатом является False , так как объект сравнения является массивом. При сравнении массива $null
с сравнением отфильтровывается все $null
значения, хранящиеся в массиве. Пример:
PS> $null -ne $null, "hello"
True
PS> $null, "hello" -ne $null
hello
Операторы равенства
Операторы равенства (-eq
, -ne
) возвращают значение TRUE или совпадения, если одно или несколько входных значений идентично указанному шаблону. Весь шаблон должен соответствовать всему значению.
Пример
-eq
Описание: равно. Включает идентичное значение.
Пример
PS> 2 -eq 2
True
PS> 2 -eq 3
False
PS> 1,2,3 -eq 2
2
PS> "abc" -eq "abc"
True
PS> "abc" -eq "abc", "def"
False
PS> "abc", "def" -eq "abc"
abc
-ne
Описание: не равно. Включает другое значение.
Пример
PS> "abc" -ne "def"
True
PS> "abc" -ne "abc"
False
PS> "abc" -ne "abc", "def"
True
PS> "abc", "def" -ne "abc"
def
-gt
Описание: больше, чем.
Пример
PS> 8 -gt 6
True
PS> 7, 8, 9 -gt 8
9
Примечание
Это не следует путать с >
оператором больше, чем оператор во многих других языках программирования. В PowerShell >
используется для перенаправления. Дополнительные сведения см. в About_redirection.
-ge
Описание: больше или равно.
Пример
PS> 8 -ge 8
True
PS> 7, 8, 9 -ge 8
8
9
-lt
Описание: меньше.
Пример
PS> 8 -lt 6
False
PS> 7, 8, 9 -lt 8
7
-le
Описание: меньше или равно.
Пример
PS> 6 -le 8
True
PS> 7, 8, 9 -le 8
7
8
Операторы сопоставления
Операторы like (-like
и -notlike
) находят элементы, которые соответствуют или не соответствуют указанному шаблону с помощью выражений с подстановочными знаками.
Синтаксис:
<string[]> -like <wildcard-expression>
<string[]> -notlike <wildcard-expression>
Операторы сопоставления (-match
и -notmatch
) находят элементы, которые соответствуют или не соответствуют указанному шаблону с помощью регулярных выражений.
Операторы сопоставления заполняют $Matches
автоматическую переменную, если входной (левый аргумент) оператору является одним скалярным объектом. Если входные данные скалярны, -match
операторы -notmatch
возвращают логическое значение и задают значение автоматической $Matches
переменной соответствующим компонентам аргумента.
Синтаксис:
<string[]> -match <regular-expression>
<string[]> -notmatch <regular-expression>
-like
Описание. Сопоставление с использованием подстановочного знака (*).
Пример
PS> "PowerShell" -like "*shell"
True
PS> "PowerShell", "Server" -like "*shell"
PowerShell
-notlike
Описание: не соответствует с использованием подстановочного знака (*).
Пример
PS> "PowerShell" -notlike "*shell"
False
PS> "PowerShell", "Server" -notlike "*shell"
Server
-match
Описание. Соответствует строке с помощью регулярных выражений. Если входные данные скалярные, он заполняет автоматическую $Matches
переменную.
Если входные данные являются коллекцией, -match
операторы -notmatch
возвращают соответствующие элементы этой коллекции, но оператор не заполняет $Matches
переменную.
Например, следующая команда отправляет в оператор коллекцию -match
строк. Оператор -match
возвращает элементы в коллекции, которые соответствуют. Он не заполняет автоматическую $Matches
переменную.
PS> "Sunday", "Monday", "Tuesday" -match "sun"
Sunday
PS> $Matches
PS>
В отличие от этого, следующая команда отправляет оператору -match
одну строку. Оператор -match
возвращает логическое значение и заполняет автоматическую $Matches
переменную. Автоматическая $Matches
переменная представляет собой хэш-строку. Если группирование или запись не используются, заполняется только один ключ.
Ключ 0
представляет весь текст, который был сопоставлен. Дополнительные сведения о группировке и записи с помощью регулярных выражений см. в about_Regular_Expressions.
PS> "Sunday" -match "sun"
True
PS> $Matches
Name Value
---- -----
0 Sun
Важно отметить, что хэш-диаграмма $Matches
будет содержать только первое вхождение любого соответствующего шаблона.
PS> "Banana" -match "na"
True
PS> $Matches
Name Value
---- -----
0 na
Важно!
Ключ 0
является целым числом. Для доступа к сохраненного значения можно использовать любой метод Hashtable .
PS> "Good Dog" -match "Dog"
True
PS> $Matches[0]
Dog
PS> $Matches.Item(0)
Dog
PS> $Matches.0
Dog
Оператор -notmatch
заполняет автоматическую $Matches
переменную, если входные данные скалярные, а результатом является False, что он обнаруживает совпадение.
PS> "Sunday" -notmatch "rain"
True
PS> $matches
PS>
PS> "Sunday" -notmatch "day"
False
PS> $matches
Name Value
---- -----
0 day
-notmatch
Описание: не соответствует строке. Использует регулярные выражения. Если входные данные скалярные, он заполняет автоматическую $Matches
переменную.
Пример
PS> "Sunday" -notmatch "sun"
False
PS> $matches
Name Value
---- -----
0 sun
PS> "Sunday", "Monday" -notmatch "sun"
Monday
Операторы сдерживания
Операторы сдерживания (-contains
и -notcontains
) похожи на операторы равенства. Однако операторы хранения всегда возвращают логическое значение, даже если входные данные являются коллекцией.
Кроме того, в отличие от операторов равенства, операторы сдерживания возвращают значение, как только они обнаруживают первое совпадение. Операторы равенства оценивают все входные данные, а затем возвращают все совпадения в коллекции.
-contains
Описание: оператор containment. Указывает, содержит ли коллекция ссылочных значений одно тестовое значение. Всегда возвращает логическое значение. Возвращает значение TRUE, только если тестовое значение точно соответствует хотя бы одному из ссылочных значений.
Если значение теста является коллекцией, оператор Contains использует равенство ссылок. Он возвращает значение TRUE, только если одно из ссылочных значений является одним экземпляром объекта тестового значения.
В очень большой коллекции -contains
оператор возвращает результаты быстрее, чем оператор равно.
Синтаксис:
<Reference-values> -contains <Test-value>
Примеры:
PS> "abc", "def" -contains "def"
True
PS> "Windows", "PowerShell" -contains "Shell"
False #Not an exact match
# Does the list of computers in $DomainServers include $ThisComputer?
PS> $DomainServers -contains $thisComputer
True
PS> "abc", "def", "ghi" -contains "abc", "def"
False
PS> $a = "abc", "def"
PS> "abc", "def", "ghi" -contains $a
False
PS> $a, "ghi" -contains $a
True
-notcontains
Описание: оператор containment. Указывает, содержит ли коллекция ссылочных значений одно тестовое значение. Всегда возвращает логическое значение. Возвращает значение TRUE, если тестовое значение не является точным совпадением по крайней мере для одного из ссылочных значений.
Если значение теста является коллекцией, оператор NotContains использует равенство ссылок.
Синтаксис:
<Reference-values> -notcontains <Test-value>
Примеры:
PS> "Windows", "PowerShell" -notcontains "Shell"
True #Not an exact match
# Get cmdlet parameters, but exclude common parameters
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 $_ }
}
# Find unapproved verbs in the functions in my module
PS> $ApprovedVerbs = Get-Verb | foreach {$_.verb}
PS> $myVerbs = Get-Command -Module MyModule | foreach {$_.verb}
PS> $myVerbs | where {$ApprovedVerbs -notcontains $_}
ForEach
Sort
Tee
Where
-in
Описание: оператор In. Указывает, отображается ли тестовое значение в коллекции ссылочных значений. Всегда возвращается как логическое значение. Возвращает значение TRUE, только если тестовое значение точно соответствует хотя бы одному из ссылочных значений.
Если тестовое значение является коллекцией, оператор In использует равенство ссылок. Он возвращает значение TRUE, только если одно из ссылочных значений является одним экземпляром объекта тестового значения.
Оператор -in
появился в PowerShell 3.0.
Синтаксис:
<Test-value> -in <Reference-values>
Примеры:
PS> "def" -in "abc", "def"
True
PS> "Shell" -in "Windows", "PowerShell"
False #Not an exact match
PS> "Windows" -in "Windows", "PowerShell"
True #An exact match
PS> "Windows", "PowerShell" -in "Windows", "PowerShell", "ServerManager"
False #Using reference equality
PS> $a = "Windows", "PowerShell"
PS> $a -in $a, "ServerManager"
True #Using reference equality
# Does the list of computers in $DomainServers include $ThisComputer?
PS> $thisComputer -in $domainServers
True
-notin
Описание. Указывает, отображается ли тестовое значение в коллекции ссылочных значений. Всегда возвращает логическое значение. Возвращает значение TRUE, если тестовое значение не является точным совпадением по крайней мере для одного из ссылочных значений.
Если тестовое значение является коллекцией, оператор In использует равенство ссылок. Он возвращает значение TRUE, только если одно из ссылочных значений является одним экземпляром объекта тестового значения.
Оператор -notin
появился в PowerShell 3.0.
Синтаксис:
<Test-value> -notin <Reference-values>
Примеры:
PS> "def" -notin "abc", "def"
False
PS> "ghi" -notin "abc", "def"
True
PS> "Shell" -notin "Windows", "PowerShell"
True #Not an exact match
PS> "Windows" -notin "Windows", "PowerShell"
False #An exact match
# Find unapproved verbs in the functions in my module
PS> $ApprovedVerbs = Get-Verb | foreach {$_.verb}
PS> $MyVerbs = Get-Command -Module MyModule | foreach {$_.verb}
PS> $MyVerbs | where {$_ -notin $ApprovedVerbs}
ForEach
Sort
Tee
Where
Оператор замены
Оператор -replace
заменяет все или часть значения указанным значением с помощью регулярных выражений. Оператор можно использовать -replace
для многих административных задач, таких как переименование файлов. Например, следующая команда изменяет расширения имен файлов всех .txt файлов на LOG:
Get-ChildItem *.txt | Rename-Item -NewName { $_.name -replace '\.txt$','.log' }
Синтаксис -replace
оператора выглядит следующим образом, где <original>
заполнитель представляет заменяемые символы, а <substitute>
заполнитель представляет символы, заменяющие их:
<input> <operator> <original>, <substitute>
По умолчанию -replace
оператор не учитывает регистр. Чтобы сделать его чувствительным к регистру, используйте -creplace
. Чтобы сделать его явным образом без учета регистра, используйте -ireplace
.
Рассмотрим следующие примеры:
PS> "book" -replace "B", "C"
Cook
"book" -ireplace "B", "C"
Cook
"book" -creplace "B", "C"
book
Также можно использовать регулярные выражения для динамической замены текста с помощью захватывающих групп и подстановок. Дополнительные сведения см. в разделе about_Regular_Expressions.
Подстановки ScriptBlock
Начиная с PowerShell 6, можно использовать аргумент ScriptBlock для текста подстановки . ScriptBlock будет выполняться для каждого совпадения, найденного во входной строке.
В ScriptBlock используйте $_
автоматическую переменную для ссылки на текущий объект System.Text.RegularExpressions.Match . Объект Match предоставляет доступ к заменяемым текущим входным текстом, а также другим полезным сведениям.
В этом примере каждая последовательность из трех десятичных знаков заменяется эквивалентом символа. ScriptBlock выполняется для каждого набора из трех десятичных разрядов, которые необходимо заменить.
PS> "072101108108111" -replace "\d{3}", {[char][int]$_.Value}
Hello
Сравнение типов
Операторы сравнения типов (-is
и -isnot
) используются для определения того, является ли объект определенным типом.
-is
Синтаксис:
<object> -is <type reference>
Пример.
PS> $a = 1
PS> $b = "1"
PS> $a -is [int]
True
PS> $a -is $b.GetType()
False
-isnot
Синтаксис:
<object> -isnot <type reference>
Пример.
PS> $a = 1
PS> $b = "1"
PS> $a -isnot $b.GetType()
True
PS> $b -isnot [int]
True