Instrução Powershell Switch com vários valores

11

Alguém sabe como posso ter uma instrução switch com vários valores possíveis, como no exemplo abaixo?

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

Costumava ser fácil no VBScript, por isso tenho certeza de que estou perdendo algo simples.

por exemplo, em VBScript

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

Saúde antecipadamente,

Ben

Ben
fonte

Respostas:

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
fonte
+1 Usar -eq em vez de -contains é ainda melhor.
Bernie White
11

No seu caso, você pode simplesmente usar

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

Uma tentativa real de modelar o que você pode fazer no VB provavelmente seria algo como

switch ($myNumber) {
  { 1,3,5,7,9  -contains $_ } { "Odd" }
  { 2,4,6,8,10 -contains $_ } { "Even" }
}
Joey
fonte
Gosto mais deste porque é mais familiar às declarações de troca tradicionais.
Mark Henderson
0

Adicionando isso para completar ...

O código do PowerShell mais próximo do script VB acima é:

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

Como o Select Case do script VB opera por meio de um OR

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

"Se testexpression corresponder a qualquer expressão da lista de expressões Case, as instruções a seguir à cláusula Case serão executadas até a próxima cláusula Case ..." Select Case Statement

O interessante que não consegui descobrir é esse resultado:

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
fonte
0

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

Jindra
fonte
-1

Que tal isso para uma alternativa fácil usando regex ?

switch -regex ($myNumber)
{
   "^[13579]$"     { Write-Host "Odd" }
   "^([2468]|10)$" { Write-Host "Even" }
   default         { Write-Host "Other" }
}
Simon
fonte
1
-1 para a |10peça.
Deer Hunter