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

Объяснение о содержании массива PowerShell


Массивы позволяют хранить несколько значений в одной переменной. Таким образом, вы можете легко пройти через каждое значение и обработать его в вашем скрипте. Но иногда вам нужно проверить, содержит ли массив PowerShell конкретное значение.

Чтобы проверить, существует ли значение в массиве, мы можем использовать оператор -Contains в PowerShell. Это вернет true, если значение существует. Но есть и другие варианты.

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

Массив PowerShell содержит

Рекомендуемый способ проверки наличия конкретного значения в массиве — это использование оператора -contains или метода .Contains() в PowerShell. Несмотря на то, что оба выглядят похоже, между ними есть некоторые важные различия.

Сначала давайте быстро посмотрим, как использовать оператор -contains. Чтобы просто проверить, находится ли строка в массиве, вы можете сделать следующее:

$array = @('apple', 'banana', 'cherry')

if ($array -contains 'banana') {
    Write-Host "Array contains banana"
}else{
    Write-Host "Banana not found in the array"
}

Метод выше просто проверит, существует ли строка в массиве. Сравнение нечувствительно к регистру, и оператор остановится, когда результаты будут найдены. Поэтому, когда элемент, фрукт в приведенном выше примере, перечислен несколько раз в массиве, он все равно просто вернет True или False.

Итак, есть несколько других вариантов, когда дело доходит до проверки, присутствует ли значение в массиве. Помимо метода .Contains(), мы также можем использовать:

  • -в оператор – проверяет, находится ли значение в массиве, просто другой способ его записи.
  • -ccontains оператор – регистронезависимое сравнение
  • -eq – Также можно проверить, содержит ли массив определённое значение
  • Where-Object – Позволяет выполнять более сложные сравнения

Убедитесь, что вы также прочитали статью об операторах PowerShell, если хотите узнать больше о различных возможностях.

Оператор Contains против метода Contains

Итак, я хочу сначала объяснить разницу между оператором contains и методом contains. Они выглядят очень похоже, но на самом деле есть больше нюансов.

Метод Contains, записываемый как .contains(), является методом из базового фреймворка .NET, тогда как оператор специфичен для PowerShell. Теперь метод .NET работает быстрее, поэтому, когда вам нужно найти значение в большом массиве, это дает реальное преимущество.

Еще одно важное различие между ними заключается в том, что метод contains по умолчанию чувствителен к регистру, тогда как оператор - нет:

$array = @('apple', 'banana', 'cherry', 'banana')

$array -contains 'Banana' # Returns true
$array.Contains('Banana') # Returns false

Чувствительный к регистру содержит

Как упоминалось, оператор contains не учитывает регистр, что часто бывает вполне приемлемо. Но когда вы можете также сделать точное соответствие значения с учетом регистра, используя оператор -ccontains (обратите внимание на двойное c).

$array = @('apple', 'banana', 'cherry', 'banana')

Case sensitive comparison
$array -ccontains 'Banana' # Returns false

Массив не содержит

Вместо того чтобы проверять, содержит ли массив конкретное значение, мы также можем проверить, содержит ли массив указанное значение. Для этого мы можем использовать оператор -notcontains. Оператор вернет True, если значение не указано в массиве.

Например, у нас есть список пользователей, которые прошли обучение по безопасности, и мы хотим проверить, завершил ли конкретный пользователь еще не его. В этом случае -notcontains является более логичным вариантом:

List of users
$completedTraining = @('John', 'Alice', 'Robert', 'Sarah')

Check if the user has not completed the training
if ($completedTraining -notcontains 'Jane'){
    Write-Host "Jane didn't completed the training"
}

Используя оператор -In

Оператор -in такой же, как оператор contains, только в обратном порядке. Он также возвращает true, когда значение находится в массиве, единственное отличие в том, что вы размещаете массив справа от оператора, а не слева.

Вы должны использовать оператор -in, когда он более интуитивно понятен и лаконичен для данной ситуации. Например, если мы хотим проверить, является ли пользователь членом группы Администраторов, тогда имеет больше смысла проверить, находится ли "Джейн" в группе администраторов, чем проверять, содержит ли группа администраторов "Джейн".

List of admin users
$adminUsers = @('John', 'Alice', 'Robert')

Using the -in operator
if ('Alice' -in $adminUsers) {
    Write-Output "Alice is an admin."
}

Ключевое здесь - сделать ваш код более читаемым и понятным. Вы также можете использовать оператор -notin, который проверяет, не находится ли значение в массиве.

Оператор равенства

Вы можете этого не ожидать, но мы также можем использовать оператор -eq, чтобы проверить, содержит ли массив конкретное значение в PowerShell. Большое отличие от оператора -contains заключается в том, что оператор равенства не возвращает true или false, а возвращает значение.

И, что еще более важно, он не прекращает поиск значения, когда значение найдено. Это означает, что мы также можем подсчитать или проверить, есть ли значение в массиве несколько раз:

$array = @('apple', 'banana', 'cherry', 'banana')

$result = $array -eq "banana"

if ($result) {
    Write-Host "Banana is listed $($result.Length) time(s) in the array"
}

Result
Banana is listed 2 time(s) in the array

Использование Where-Object

Последний вариант, который я хочу вам показать, это метод Where-Object, чтобы проверить, содержит ли массив конкретное значение. Этот метод в основном используется, когда у вас есть массив объектов или необходимо выполнять другие сложные сравнения.

Например, у нас есть массив с объектами пользователей, и мы хотим проверить, содержит ли массив конкретного пользователя:

$users = @(
    [PSCustomObject]@{ Name = 'John'; Age = 30 },
    [PSCustomObject]@{ Name = 'Jane'; Age = 25 },
    [PSCustomObject]@{ Name = 'Alice'; Age = 28 }
)

$result = $users | Where-Object { $_.Name -contains 'Jane'}

Заключение

Наиболее распространенный способ проверки наличия конкретного значения в массиве — это использование оператора -contains. Однако стоит помнить, что это нечувствительно к регистру, в то время как метод .contains() чувствителен к регистру.

Старайтесь использовать подходящий оператор для ситуации, это сделает ваш код более понятным и читаемым.

Надеюсь, вам понравилась эта статья. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.