我一定错过了一些东西。我正在计算一个列表,并且想跳过特定数字,所以我做了一个 switch 语句:
$locationNumber = 00
DO {
$locationNumber++
switch ($locationNumber) {
21 {$locationNumber++}
31 {$locationNumber++}
43 {$locationNumber++}
44 {$locationNumber++}
49 {$locationNumber++}
51 {$locationNumber++}
}
Write-Host $locationNumber
} while ($locationNumber -lt 53)
这是输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 号 18 19 20 22 23 24 25 26 27 28 29 30 32 33 34 35 36 37 38 39 40 41 42 44 45 46 47 48 50 52 53
请注意,尽管我没有休息时间,但还是出现了 44。有人可以告诉我为什么/解决这个问题的方法吗?
您可能想要的是开关
default
子句。
如果在 switch 语句中将
Write-Host
移至 default
,这意味着如果其他条件不满足,则default 执行此操作。
$locationNumber = 00
DO {
$locationNumber++
switch ($locationNumber) {
21 {}
31 {}
43 {}
44 {}
49 {}
51 {}
default {Write-Host $locationNumber}
}
} while ($locationNumber -lt 53)
如果您想消除一组固定的数字 -
21, 31, 43, 44, 49, 51
- 从一系列数字 - 1
到53
:
$(
switch (1..53) {
{ $_ -notin 21, 31, 43, 44, 49, 51 } { $_ }
}
) -join ' '
上面的结果(换行以提高可读性) - 请注意上面列表中的所有数字是如何缺失的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25 26 27 28 29
30 32 33 34 35 36 37 38 39 40 41 42 45 46 47 48 50 52 53
要捕获数组中的数字,只需分配给一个变量来代替
$(...)
:$nums = switch { ... }
上述利用了以下功能:
..
,范围运算符,用于创建一系列整数作为数组。
switch
语句接受脚本块({ ... }
)作为分支条件,其中手头的输入对象$_
可以通过任意表达式进行测试。
-notin
运算符,用于测试标量 LHS 是否包含在 RHS 集合中。
至于你尝试过的:
通过将
++
应用于您想要跳过的数字,它们仍然由在 Write-Host
语句的同一迭代中执行的 do
语句打印,在
switch
语句之后。Andrew Ryan Davis 的有用答案展示了通过 default
分支解决该问题的方法。
虽然上面的解决方案更加简洁,但安德鲁的答案实际上更快,尽管这在实践中可能并不重要。
$locationNumber = 00
DO {
$locationNumber++
switch ($locationNumber) {
21 {$locationNumber++}
31 {$locationNumber++}
43 {$locationNumber += 3}
47 {$locationNumber++}
49 {$locationNumber++}
51 {$locationNumber++}
}
Write-Host $locationNumber
} while ($locationNumber -lt 53)
我将 3 添加到 43 以跳过我不需要的那些。谢谢。