О операторах сравнения

Краткое описание

Описывает операторы, сравнивающие значения в 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

СМ. ТАКЖЕ