Istruzione Switch Powershell con più valori


11

Qualcuno sa come posso avere un'istruzione switch con più valori possibili come nell'esempio qui sotto?

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

Utilizzato per essere semplice in VBScript, quindi sono sicuro che mi manca qualcosa di semplice.

ad es. in VBScript

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

Saluti in anticipo,

Ben

Risposte:


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'uso di -eq invece di -contains è ancora meglio.
Bernie White,

11

Nel tuo caso puoi semplicemente usare

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

Un vero tentativo di modellare ciò che puoi fare lì in VB probabilmente sarebbe qualcosa di simile

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

Mi piace di più, perché è più familiare alle tradizionali istruzioni switch.
Mark Henderson,

0

Aggiungendo questo per completezza ...

Il codice PowerShell più vicino allo script VB sopra è:

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

Poiché lo script VB Select Case opera tramite un OR

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

"Se testexpression corrisponde a qualsiasi espressione dell'elenco di espressioni Case, le istruzioni che seguono quella clausola Case vengono eseguite fino alla clausola Case successiva ..." Seleziona istruzione Case

La cosa interessante che non sono stato in grado di capire è questo risultato:

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

Che ne dici di una semplice alternativa usando regex ?

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

1
-1 per la |10parte.
Deer Hunter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.