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

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" }
}

+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" }
}

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 

0

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


-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" }
}

1
-1 dla |10części.
Deer Hunter,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.