PowerShell - Проверка числа в непоследовательном диапазоне не удалась

PowerShell - Проверка числа в непоследовательном диапазоне не удалась

У меня есть список цифр, некоторые последовательны, некоторые с перерывами. Вот пример.
(1..10),12,15,(30..45),50,53

Когда я пытаюсь узнать, есть ли «мой номер» в этом списке (допустим, есть) 4, все проверки не проходят.

> 4 -in (1..10),12,15,(30..45),50,53
> False

> (1..10),12,15,(30..45),50,53 -contains 4
> False

> ((1..10),12,15,(30..45),50,53).contains(4)
> False

> (1..10),12,15,(30..45),50,53
> 1
2
3
4
etc...

Что я делаю не так?

решение1

По умолчанию Powershell использует запятые для создания массивов массивов:

(1..10),12,15,(30..45),50,53 | Foreach {$_ -join ' '}

1 2 3 4 5 6 7 8 9 10
12
15
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
50
53

4не равно 1 2 3 4..., поэтому сравнение ложно.


Один из простых способов получить то, что вы ищете, — это выразить $()элементы списка, разделенные точкой с запятой вместо запятой, например:

$((1..10);12;15;(30..45);50;53) -contains 4

True

Похожие ключевые слова — разворачивание или выравнивание списка/массива

решение2

СпасибоДжефф Цейтлин. Решение состоит в том, чтобы «сгладить» массив. В моем случае самым простым и совместимым способом сделать это было передать вывод в конвейер write-outputи затем проверить его.

> ((1..10),12,15,(30..45),50,53 | write-output) -contains 4
> True

решение3

Существует простой синтаксис для объединения коллекции массивов в один массив:

4 -in @((1..10),12,15,(30..45),50,53 | ForEach-Object {$_})

Связанный контент