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

Ben
quelle

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" }
}
Torai
quelle
+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" }
}
Joey
quelle
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 
Christopher_G_Lewis
quelle
0

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

Jindra
quelle
-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" }
}
Simon
quelle
1
-1 für das |10Teil.
Deer Hunter