14 votes

Instruction Powershell Switch avec plusieurs valeurs

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

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

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

Par exemple, en VBScript

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

Merci d'avance,

Ben

13voto

popcnt Points 1842
$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" }
}

0 votes

+1 L'utilisation de -eq au lieu de -contains est encore meilleure.

12voto

codingkevin Points 1133

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 faire ici en VB serait probablement quelque chose comme

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

0 votes

Je préfère celle-ci parce qu'elle est plus familière aux déclarations d'échange traditionnelles.

2voto

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

1voto

JCCyC Points 583

J'ajoute 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 opère via un OR

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

"Si tesexpression correspond à une expression de la liste d'expressions Case, les instructions qui suivent cette clause Case sont exécutées jusqu'à la clause Case suivante..." Sélectionner la déclaration de cas

La chose intéressante que je n'ai pas réussi à 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

-1voto

Simon Points 1

Que pensez-vous de cette alternative facile qui consiste à utiliser regex ?

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

1 votes

-1 pour le |10 partie.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X