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

相关内容