PowerShell -在switch语句中使用列表

xienkqul  于 2023-05-17  发布在  Shell
关注(0)|答案(4)|浏览(235)

首先,请原谅我,因为我是PowerShell的新手。
我试图找到一种方法来给予下面的switch语句:

Switch ($a)

{
   {$_ -eq "option1" -or $_ -eq "option2"}{Do the same thing...}
}

有没有一种方法可以将{$_ -eq "option1" -or $_ -eq "option2"}子句更改为“if $a in this list”(但显然不只是使用if,否则我还不如直接替换开关)。
在这个switch语句中最终会有许多子句,其中一些子句可能有4或5个选项,所以简洁会有很大帮助,否则它将是一个很大的语句。

o4tp2gmn

o4tp2gmn1#

您可以使用-in-contains包含运算符来简化条件:

switch ($a) {
   { $_ -in "option1", "option2" } { # OR: { "option1", "option2" -contains $_ }
       # Do the same thing...
   }
}

如果你有一个非常大的列表要比较,并且有很多项目要用switch处理,你可以考虑使用HashSet<T>中的.Contains方法来快速查找:

$hash = [System.Collections.Generic.HashSet[string]]::new(
    [string[]] ('option1', 'option2'), [System.StringComparer]::OrdinalIgnoreCase)

switch('option1', 'option2', 'option3') {
    { $hash.Contains($_) } {
        $_
    }
}
jexiocij

jexiocij2#

在这种情况下,我会选择Regex开关

$a = 'option1'
switch -Regex ($a) {
    # with regex, the | symbol means OR
    'option1|option2' { <# Do the same thing... #> }
    default           { <# Do something else if the above does not apply #> }
}

使用正则表达式为您提供了更多的比较选项。例如:

  • 如果$a中的字符串需要区分大小写进行检查,您可以将参数-CaseSensitive添加到开关cmd中。
  • 如果$a中的字符串需要作为“整个单词”进行检查,则可以执行'^(option1|option2)$'。(^$是从字符串开始到字符串结束的行锚点)
  • 如果$a中的值需要包含一个单词作为整个单词do '\b(option1|option2)\b'\b表示单词边界)

正如mklement0评论的那样,当使用正则表达式时,你需要确保你测试的单词在正则表达式中有特殊含义的所有字符(见下表)都用反斜杠**转义。
假设你的值有点,那么最简单的方法是在每个单词上使用[regex]::Escape(),然后将它们与正则表达式OR字符(|)组合,如下所示:

$a = 'option.1'
# this is the list of values you want to test inside the switch
$list = 'option.1', 'option.2'

# now create a regex string 'option\.1|option\.2' from that list
$regexCheck = ($list | ForEach-Object { [regex]::Escape($_) }) -join '|'

switch -Regex ($a) {
    $regexCheck { <# Do the same thing... #> }
    default     { <# Do something else if the above does not apply #> }
}

Regex中的特殊字符

查尔说明含义
|反斜杠用于转义特殊字符
^加雷特字符串的开头
$美元符号字符串结束
.句号或圆点匹配任何单个字符
|竖线或竖线符号匹配上一个或下一个字符/组
问号匹配零个或一个先前的
*星号还是星星匹配零个、一个或多个先前的
+加号匹配一个或多个先前的
()左、右括号群体特征
[ ]开合方括号匹配一定范围的字符
我的天左花括号和右花括号对象的指定次数匹配
ycggw6v2

ycggw6v23#

你是PowerShell的新手,那么看看这里:https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_switch
使用匹配列表可以通过这种方式轻松管理。

# Switch argument and match lists:
$Local:a = "optionA"
$Local:SwitchCase_1_List = @("option1", "option2")
$Local:SwitchCase_2_List = @("optionA", "optionB")

# Run 
switch ($a){
    { $SwitchCase_1_List.Contains($a) } {
         Write-Host -Object "Do the something because of switch case 1 ..."
         break
    }
    { $SwitchCase_2_List.Contains($a) } {
         Write-Host -Object "Do the something because of switch case 2 ..."
         break
    }
}
0md85ypi

0md85ypi4#

-eq的左边可以是一个列表:

switch ('option1','option2','option3') 
{
  {'option1','option2' -eq $_} {"$_ : Do the same thing..."}
  default {"$_ : Or do this..."}
}

option1 : Do the same thing...
option2 : Do the same thing...
option3 : Or do this...

相关问题