Powershell Switch-Anweisung mit mehreren Werten


11

Weiß jemand, wie ich eine switch-Anweisung mit mehreren möglichen Werten wie im folgenden Beispiel haben kann?

switch ($myNumber) {
   1 3 5 7 9 { write-host "Odd" }
   2 4 6 8 10 {write-host "Even" }
}

Früher war es in VBScript einfach, daher fehlt mir sicher nur etwas Einfaches.

zB in VBScript

Select Case myNumber 
   Case 1,3,5,7,9
      MsgBox "Odd"
   Case 2,4,6,8,10
      MsgBox "Even"
End Select

Prost im Voraus,

Ben

Antworten:


11
$myNumber = 3
$arrA = 1, 3, 5, 7, 9
$arrB = 2, 4, 6, 8, 10
switch ($myNumber) { 
    {$arrA -contains $_} { write-host "Odd" } 
    {$arrB -contains $_} { write-host "Even" }
}

+1 Die Verwendung von -eq anstelle von -contains ist noch besser.
Bernie White

11

In Ihrem Fall können Sie einfach verwenden

switch ($myNumber) {
  { $_ % 2 -eq 1 } { "Odd" }
  { $_ % 2 -eq 0 } { "Even" }
}

Ein tatsächlicher Versuch zu modellieren, was Sie dort in VB tun können, wäre wahrscheinlich so etwas wie

switch ($myNumber) {
  { 1,3,5,7,9  -contains $_ } { "Odd" }
  { 2,4,6,8,10 -contains $_ } { "Even" }
}

Ich mag dieses besser, weil es den traditionellen switch-Anweisungen vertrauter ist.
Mark Henderson

0

Der Vollständigkeit halber hinzufügen ...

Der dem obigen VB-Skript am nächsten liegende PowerShell-Code lautet:

PS C:\> switch (1) {  
  {$_ -eq 1 -or $_ -eq 3 -or $_ -eq 5 -or $_ -eq 7 -or $_ -eq 9} { "Odd"}
  {$_ -eq 2 -or $_ -eq 4 -or $_ -eq 6 -or $_ -eq 8 -or $_ -eq 10} { "Even"}
}
Odd

PS C:\VSProjects\Virtus\App_VM> switch (2) {  
  {$_ -eq 1 -or $_ -eq 3 -or $_ -eq 5 -or $_ -eq 7 -or $_ -eq 9} { "Odd"}
  {$_ -eq 2 -or $_ -eq 4 -or $_ -eq 6 -or $_ -eq 8 -or $_ -eq 10} { "Even"}
}
Even

Weil das VB-Skript Select Case über ein ODER arbeitet

Select Case testexpression
   [Case expressionlist-n
      [statements-n]] . . .
   [Case Else
      [elsestatements-n]]
End Select

"Wenn testexpression mit einem Case-Ausdruckslistenausdruck übereinstimmt, werden die Anweisungen, die auf diese Case-Klausel folgen, bis zur nächsten Case-Klausel ausgeführt ..." Wählen Sie Case-Anweisung aus

Das Interessante, das ich nicht herausfinden konnte, ist dieses Ergebnis:

PS C:\> switch (1) {  
  {1 -or 3 -or 5 -or 7 -or 9} { "Odd"}
  {2 -or 4 -or 6 -or 8 -or 10} { "Even"}
}
Odd
Even 

0

switch ($myNumber) {
{$_ -in 1, 3, 5, 7, 9} { write-host "Odd" }
{$_ -in 2, 4, 6, 8, 10} {write-host "Even" }
}


-1

Wie wäre es damit für eine einfache Alternative mit Regex ?

switch -regex ($myNumber)
{
   "^[13579]$"     { Write-Host "Odd" }
   "^([2468]|10)$" { Write-Host "Even" }
   default         { Write-Host "Other" }
}

1
-1 für das |10Teil.
Deer Hunter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.