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...,因此比較結果為 false。


獲取所需內容的簡單方法是表達$()用分號而不是逗號分隔的清單元素,例如:

$((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 {$_})

相關內容