Instruction Powershell Switch avec plusieurs valeurs


11

Quelqu'un sait comment je peux avoir une instruction switch avec plusieurs valeurs possibles comme l'exemple ci-dessous?

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

Auparavant, c'était facile dans VBScript, donc je suis sûr qu'il me manque quelque chose de simple.

par exemple dans VBScript

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

Bravo à l'avance,

Ben

Réponses:


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 L'utilisation de -eq au lieu de -contains est encore meilleure.
Bernie White

11

Dans votre cas, vous pouvez simplement utiliser

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

Une tentative réelle de modéliser ce que vous pouvez y faire dans VB serait probablement quelque chose comme

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

J'aime mieux celui-ci car il est plus familier avec les instructions de commutation traditionnelles.
Mark Henderson

0

Ajouter ceci pour être complet ...

Le code PowerShell le plus proche du script VB ci-dessus est:

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

Parce que le script VB Select Case fonctionne via un OU

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

"Si testexpression correspond à une expression de liste d'expressions Case, les instructions suivant cette clause Case sont exécutées jusqu'à la clause Case suivante ..." Select Case Statement

La chose intéressante que je n'ai pas pu comprendre est ce résultat:

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

Que diriez-vous de cela pour une alternative facile en utilisant regex ?

switch -regex ($myNumber)
{
   "^[13579]$"     { Write-Host "Odd" }
   "^([2468]|10)$" { Write-Host "Even" }
   default         { Write-Host "Other" }
}

1
-1 pour la |10pièce.
Deer Hunter
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.