带有条件数组的 PowerShell Switch 语句

问题描述 投票:0回答:3

我正在尝试找到一种方法来使用带有通配符的项目数组作为 switch 语句中的条件,但没有取得太大成功。这是我正在尝试做的一个例子,

$pcModel = "HP ProDesk 800 G5"
switch -Wildcard ($pcModel.ToUPPER()) {
    "*PROBOOK*" {  
        #Do something
        Break
    }
    "*ELITEBOOK*" {  
        #Do something else
        Break
    }

    {$_ -in "*ELITEDESK*", "*PRODESK*", "*ELITEONE*" }{
    # have also tried
    #{$_ -eq "*ELITEDESK*", "*PRODESK*", "*ELITEONE*" }
    #{"*ELITEDESK*", "*PRODESK*", "*ELITEONE*" -eq $_ }
    #{"*ELITEDESK*", "*PRODESK*", "*ELITEONE*" -like $_ }
    #{@("*ELITEDESK*", "*PRODESK*", "*ELITEONE*") -contains $_ }
        # Do other things
        Break
    }
    Default{
        # do nothing
        Break
    }
}

正如我在代码中评论的那样,我已经尝试了多次以通配符作为条件的数组的化身,但没有成功。条件总是失败我错过了什么。在有人因为 switch 语句不区分大小写而批评我使用 ToUPPER 之前,在这个特定的示例中我发现这是错误的。

arrays powershell switch-statement
3个回答
2
投票

使用

-wildcard
代替
-regex
选项。正则表达式允许您使用
|
OR 操作数构建“A 或 B”类型匹配:

$pcModel = "HP ProDesk 800 G5"
switch -regex ($pcModel.ToUPPER()) {
    'PROBOOK' {  
        #Do something
        Break
    }
    'ELITEBOOK' {  
        #Do something else
        Break
    }

    'ELITEDESK|PRODESK|ELITEONE' {
        # Do other things
        Break
    }
    Default{
        # do nothing
        Break
    }
}

0
投票

更离奇的答案。如果 3 个赞之一为真,则成功。

switch ('elitedesk2','elotedesk') {  
  { $true -in $(foreach ($pattern in "*elitedesk*","*prodesk*","*eliteone*") 
    { $_ -like $pattern }) } { "$_ matches" }
  default { "$_ doesn't match"}
}

elitedesk2 matches
elotedesk doesn't match

0
投票

执行此操作的另一种方法是使用脚本块作为条件

我需要一种根据文档类型快速加载特定库的方法:

$lib = switch ([System.IO.Path]::GetExtension($File)) {
    {$_ -in '.docx', '.doc' } { 'words' }
    {$_ -in '.ppt', '.pptx' } { 'slides' }
    'pdf' { 'pdf' }
    Default { $false }
}

Write-Host $lib
© www.soinside.com 2019 - 2024. All rights reserved.