Sentencia de Powershell Switch con múltiples valores

11

¿Alguien sabe cómo puedo tener una declaración de cambio con múltiples valores posibles como el ejemplo a continuación?

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

Solía ​​ser fácil en VBScript, así que estoy seguro de que me falta algo simple.

por ejemplo, en VBScript

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

Saludos de antemano,

Ben

Ben
fuente

Respuestas:

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
fuente
+1 Usar -eq en lugar de -contains es aún mejor.
Bernie White
11

En su caso, simplemente puede usar

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

Un intento real de modelar lo que puede hacer allí en VB probablemente sería algo así como

switch ($myNumber) {
  { 1,3,5,7,9  -contains $_ } { "Odd" }
  { 2,4,6,8,10 -contains $_ } { "Even" }
}
Joey
fuente
Este me gusta más porque es más familiar para las declaraciones de cambio tradicionales.
Mark Henderson el
0

Agregando esto para completar ...

El código de PowerShell más cercano al script VB anterior es:

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

Debido a que el script Select Case de VB opera a través de un OR

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

"Si testexpression coincide con cualquier expresión de la lista de expresiones Case, las declaraciones que siguen a esa cláusula Case se ejecutan hasta la siguiente cláusula Case ..." Seleccionar declaración de caso

Lo interesante que no he podido entender es este 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
fuente
0

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

Jindra
fuente
-1

¿Qué tal esto para una alternativa fácil usando regex ?

switch -regex ($myNumber)
{
   "^[13579]$"     { Write-Host "Odd" }
   "^([2468]|10)$" { Write-Host "Even" }
   default         { Write-Host "Other" }
}
Simón
fuente
1
-1 para la |10parte.
Deer Hunter