【问题标题】:PowerShell switch statement with conditionals带有条件的 PowerShell switch 语句
【发布时间】:2019-01-25 16:20:38
【问题描述】:

如何在 PowerShell switch 语句中添加条件?下面的代码在应该返回 1000 时返回 0

$UsedSpaceMB = 8500

switch ($UsedSpaceMB) {
    ($UsedSpaceMB -gt 15000) { $FreeSpace = 2000 }
    ($UsedSpaceMB -in 8000..15000 ) { $FreeSpace = 1000 }
    ($UsedSpaceMB -in 1700..8000 ) { $FreeSpace = 500 }
    ($UsedSpaceMB -in 1000..1700 ) { $FreeSpace = 200 }
    ($UsedSpaceMB -in 800..1000 ) { $FreeSpace = 100 }
    ($UsedSpaceMB -lt 800 ) { $FreeSpace = 50 }
}
$FreeSpace

【问题讨论】:

  • 这段代码的用例是什么?您是否将 -in 视为某种 betweens 运算符?如果$UsedSpaceMB 是小数,这将不起作用。我认为使用$FreeSpace=switch($UsedSpaceMB){($_ -gt 15000){2000;break};($_ -gt 8000){1000;break}} 之类的东西会更好。因此,成功的第一个条件返回您的号码,然后我们使用 break 来确保不会满足其他条件。 8000..15000 正在制作一个数组,您制作完成后立即丢弃。如果频繁运行,可能会影响性能。
  • 感谢@Matt 好点
  • 按照编码,您试图将数字与布尔值进行比较,但它从未匹配过。如果您使用我在多种语言中看到的常见习语,该代码会起作用:switch ($true){... 在我看来,它使代码比 Persistent13 建议的 {} 表达式语法更具可读性。

标签: powershell conditional


【解决方案1】:

开关的语法不正确。 有关文档,请参阅here

$UsedSpaceMB = 8500

switch ($UsedSpaceMB) {
    {$_ -gt 15000} { $FreeSpace = 2000 }
    {$_ -in 8000..15000 } { $FreeSpace = 1000 }
    {$_ -in 1700..8000 } { $FreeSpace = 500 }
    {$_ -in 1000..1700 } { $FreeSpace = 200 }
    {$_ -in 800..1000 } { $FreeSpace = 100 }
    {$_ -lt 800 } { $FreeSpace = 50 }
}
$FreeSpace

【讨论】:

  • 确实如此,但我建议将break 添加到每个动作脚本块中,作为习惯问题。否则剩余的分支也会被不必要地处理(即使在这种情况下没有其他条件匹配;但是在其他情况下,您可能会无意中触发多个操作)。
【解决方案2】:

或者你可以使用 -contains

switch ($UsedSpaceMB) {
    {$_ -gt 15000} { $FreeSpace = 2000 }
    {8000..15000 -contains $_ } { $FreeSpace =1000 }
    {1700..8000 -contains $_} { $FreeSpace = 500 }
    {1000..1700 -contains $_ } { $FreeSpace = 200 }
    {800..1000 -contains $_ } { $FreeSpace = 100 }
    {$_ -lt 800 } { $FreeSpace = 50 }
}
$FreeSpace

【讨论】:

  • 如果您需要 PSv2 支持,这是一个可行的替代方案,为了养成良好的习惯,我建议使用 break 终止每个动作块,否则所有其他分支也会被处理(即使在此没有其他条件匹配案例)。
猜你喜欢
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多