Switch 语句不匹配所有条件

问题描述 投票:0回答:3

我一定错过了一些东西。我正在计算一个列表,并且想跳过特定数字,所以我做了一个 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。有人可以告诉我为什么/解决这个问题的方法吗?

powershell switch-statement
3个回答
2
投票

您可能想要的是开关

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)

2
投票

如果您想消除一组固定的数字 -

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 分支解决该问题的方法。 虽然上面的解决方案更加简洁,但安德鲁的答案实际上更快,尽管这在实践中可能并不重要。

    


-1
投票

$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 以跳过我不需要的那些。谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.