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

Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *