You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PowerShell Switch语句中使用带通配符的数组作为条件?

PowerShell Switch语句中带通配符数组条件的问题解决

核心问题原因

你之前的写法失效主要有两个关键问题:

  1. -Wildcard开关仅作用于直接字符串条件,不影响脚本块内的表达式:用{...}包裹的条件属于脚本块,Switch的-Wildcard参数不会自动处理脚本块里的通配符匹配,需要手动实现。
  2. 匹配逻辑方向错误:-like、-in等操作符的匹配方向搞反了。例如"*PRODESK*" -like $_是用通配符字符串去匹配目标字符串,这和实际需求相反——应该是目标字符串$_匹配通配符模式,即$_ -like "*PRODESK*"。同时-in、-contains是精确匹配,不支持通配符,自然无法生效。

正确写法

方法1:直接用数组作为Switch条件(推荐)

Switch允许将多个通配符字符串组成的数组作为单个条件,结合-Wildcard开关,只要目标字符串匹配数组中任意一个通配符,就会执行对应代码块:

$pcModel = "HP ProDesk 800 G5"
switch -Wildcard ($pcModel.ToUpper()) {
    "*PROBOOK*" {  
        #Do something
        Break
    }
    "*ELITEBOOK*" {  
        #Do something else
        Break
    }
    # 直接传入通配符数组,-Wildcard会自动处理每个模式的匹配
    "*ELITEDESK*", "*PRODESK*", "*ELITEONE*" {
        # Do other things
        Write-Host "匹配到桌面机型"
        Break
    }
    Default{
        # do nothing
        Break
    }
}

方法2:脚本块内手动实现通配符匹配

如果需要更复杂的逻辑(比如动态生成通配符数组),可以在脚本块内用-like结合数组判断——当左边是字符串、右边是通配符数组时,-like会返回所有匹配的元素,非空结果在布尔上下文中会被判定为$true:

$pcModel = "HP ProDesk 800 G5"
$desktopPatterns = "*ELITEDESK*", "*PRODESK*", "*ELITEONE*"

switch -Wildcard ($pcModel.ToUpper()) {
    "*PROBOOK*" {  
        #Do something
        Break
    }
    "*ELITEBOOK*" {  
        #Do something else
        Break
    }
    { $_ -like $desktopPatterns } {
        # Do other things
        Write-Host "匹配到桌面机型"
        Break
    }
    Default{
        # do nothing
        Break
    }
}

关于ToUpper()的疑问

PowerShell默认的比较操作(包括-Wildcard)确实不区分大小写,但这依赖于系统的文化设置。你手动转大写后匹配大写通配符的做法是合理的:

  • 可以规避不同文化设置下的大小写匹配差异;
  • 确保匹配逻辑完全可控,避免意外的不匹配情况。如果不需要强制大小写统一,也可以去掉ToUpper(),保持原始字符串匹配小写/混合通配符。

内容的提问来源于stack exchange,提问作者Ed R.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 05:24:07