Câu lệnh Powershell Switch có nhiều giá trị


11

Bất cứ ai cũng biết làm thế nào tôi có thể có một câu lệnh chuyển đổi với nhiều giá trị có thể như ví dụ dưới đây?

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

Được sử dụng dễ dàng trong VBScript, vì vậy tôi chắc chắn rằng tôi chỉ thiếu một cái gì đó đơn giản.

ví dụ: trong VBScript

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

Chúc mừng trước

Bến

Câu trả lời:


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 Sử dụng -eq thay vì -contains thậm chí còn tốt hơn.
Bernie White

11

Trong trường hợp của bạn, bạn chỉ cần sử dụng

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

Một nỗ lực thực tế để mô hình hóa những gì bạn có thể làm trong VB có thể sẽ giống như

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

Tôi thích cái này hơn vì nó quen thuộc hơn với các câu lệnh chuyển đổi truyền thống.
Mark Henderson

0

Thêm phần này cho hoàn chỉnh ...

Mã PowerShell gần nhất với tập lệnh VB ở trên là:

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

Bởi vì tập lệnh VB Chọn Case hoạt động thông qua OR

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

"Nếu testexpression khớp với bất kỳ biểu thức Danh sách trường hợp nào, các câu lệnh sau mệnh đề Case đó được thực thi cho đến mệnh đề Case tiếp theo ..." Chọn Báo cáo trường hợp

Điều thú vị mà tôi chưa thể tìm ra là kết quả này:

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

Làm thế nào về điều này cho một sự thay thế dễ dàng bằng cách sử dụng regex ?

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

1
-1 cho |10phần.
Deer Hunter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.