Поиск по сайту:

Как использовать метод Contains в PowerShell для строк


Оператор Contains в PowerShell немного странный. Вы, вероятно, хотите проверить, содержит ли строка определённое слово или символ. Оператор -contains звучит наиболее логично, чтобы использовать его, но так ли это?

В PowerShell оператор содержит, не выполняет сравнение подстрок. Вместо этого он является оператором коллекции. Это означает, что он проверяет, содержит ли коллекция совпадающее значение. Его нельзя использовать для поиска символа или подстроки внутри строки. Лучшим решением для этого является использование оператора -like или функции .contains().

В этой статье я объясню, как вы можете проверить, содержит ли строка символ, и объясню различия между различными операторами.

PowerShell строка содержит

Когда вы хотите проверить, содержит ли строка слово, вы, вероятно, пытались использовать оператор -содержит так:

$string = "how to find a word"

if ($string -contains "find") { 
  # Do something
}

Result
False

Но это не сработает, как вы, возможно, заметили. Это связано с тем, что -contains проверяет, соответствует ли объект $string тестовому элементу. Если вы проверите это на всей строке, contains вернет true:

$string -contains "how to find a word"  # True

Итак, когда вы хотите искать подстроку или слово внутри строки с помощью PowerShell, лучше использовать оператор -like. С -like вам нужно будет использовать подстановочные знаки вокруг вашей строки поиска:

if ($string -like "*find*") { 
  Write-host "String contains find"
}

Result
String contains find

Тем не менее, есть способ использовать содержит в PowerShell для поиска слова или символа внутри строки. Вместо оператора мы можем использовать встроенную функцию .NET .Contains() для строк. Эта строковая функция может действительно проверить, содержит ли строка слово:

if ($string.Contains("find")) { 
  Write-host "String contains find"
}

Result
String contains find

Имейте в виду, что функция Contains чувствительна к регистру, поэтому для выполнения сравнения без учета регистра вам сначала нужно преобразовать строку в нижний регистр:

if ($string.ToLower().Contains("find")) { 
  Write-host "String contains find"
}

Использование -Contains и -NotContains с объектами и массивами

Оператор "содержит" предназначен для проверки, содержит ли объект или массив данное значение. Например, если у нас есть массив с фруктами, мы можем проверить, содержит ли массив груши:

Array with fruits
$fruits = "apple","banana","pear"

Check if the array contains pear
$fruits -contains "pear"

Return
True

Мы можем искать только по целым значениям, это означает, что мы не можем использовать подстановочные знаки, как в операторе Like. Если мы попытаемся искать только по первым нескольким буквам слова 'apple', вы увидите, что это вернет ложный результат:

$fruits -contains "*app*"
Result
False

Если вы хотите проверить, содержит ли множество элемент, вы можете использовать оператор -notcontains. Например, если вы хотите убедиться, что массив фруктов не содержит малину, мы можем сделать следующее:

$fruits -notcontains "raspberry"

Returns
True

-in и -notin операторы

Операторы -in и -notin в PowerShell в основном аналогичны операторам -contains и -notcontains. Разница заключается в том, что они работают в обратном порядке. С оператором -contains тестируемый объект находится справа от оператора. С -in он находится слева от него:

$fruits = "apple","banana","pear"

"apple" -in $fruits			# True
"raspberry -notin $fruits		# True

Similar to
$fruits -contains "apple"		# True
$fruits -notcontains "raspberry         # True

Использование оператора in вместо contains может улучшить читаемость вашего кода. Но, кроме этого, нет никаких преимуществ в его использовании по сравнению с contain.

Заключение

Если вы хотите узнать в PowerShell, содержит ли строка определенную строку или слово, то вам нужно использовать оператор -like или функцию .contains(). Оператор contains может использоваться только для объектов или массивов, так же как его синтаксический аналог -in и -notin.

Надеюсь, эта статья помогла вам понять различия между различными операторами и функциями. Узнайте больше о скриптах PowerShell в этом полном руководстве. Если у вас есть какие-либо вопросы или советы, просто оставьте комментарий ниже.