Instrukcja przełącznika PowerShell z wieloma wartościami

11

Czy ktoś wie, jak mogę uzyskać instrukcję switch z wieloma możliwymi wartościami, jak na przykład poniżej?

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

Kiedyś był łatwy w VBScript, więc jestem pewien, że brakuje mi czegoś prostego.

np. w VBScript

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

Pozdrawiam z góry,

Ben

Ben
źródło

Odpowiedzi:

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
źródło
+1 Użycie -eq zamiast -contains jest jeszcze lepsze.
Bernie White
11

W twoim przypadku możesz po prostu użyć

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

Rzeczywista próba modelowania tego, co można tam zrobić w VB, prawdopodobnie byłaby podobna

switch ($myNumber) {
  { 1,3,5,7,9  -contains $_ } { "Odd" }
  { 2,4,6,8,10 -contains $_ } { "Even" }
}
Joey
źródło
Ten bardziej mi się podoba, ponieważ jest bardziej znany z tradycyjnych instrukcji switch.
Mark Henderson
0

Dodanie tego dla kompletności ...

Kod programu PowerShell najbliższy powyższemu skryptowi VB to:

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

Ponieważ skrypt VB Select Case działa poprzez OR

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

„Jeśli testexpression pasuje do dowolnego wyrażenia listy wyrażeń Case, instrukcje następujące po tej klauzuli Case są wykonywane do następnej klauzuli Case ...” Wybierz instrukcję Case

Interesującą rzeczą, której nie byłem w stanie zrozumieć, jest ten wynik:

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
źródło
0

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

Jindra
źródło
-1

Co powiesz na łatwą alternatywę przy użyciu wyrażenia regularnego ?

switch -regex ($myNumber)
{
   "^[13579]$"     { Write-Host "Odd" }
   "^([2468]|10)$" { Write-Host "Even" }
   default         { Write-Host "Other" }
}
Szymon
źródło
1
-1 dla |10części.
Deer Hunter,