首页 > 解决方案 > switch 语句不匹配所有条件

问题描述

我一定在这里遗漏了一些东西。我正在计算一个列表,并且想跳过特定的数字,所以我做了一个 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 437 48

请注意,出现了 44,即使我没有休息时间。有人可以告诉我为什么/解决这个问题的方法吗?

谢谢,

编辑:为上下文添加了更多代码

标签: powershellswitch-statement

解决方案


如果您想从一系列数字中消除一组固定数字-通过21, 31, 43, 44, 49, 51153

$(
  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执行的语句打印出来,在语句之后。doswitch

Andrew Ryan Davis 的有用答案default显示了通过分支解决该问题的方法。虽然上面的解决方案更简洁,但安德鲁的答案实际上更快,尽管这在实践中可能并不重要。


推荐阅读