
У меня есть список цифр, некоторые последовательны, некоторые с перерывами. Вот пример.
(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 {$_})