我正在尝试找到一种方法来使用带有通配符的项目数组作为 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 之前,在这个特定的示例中我发现这是错误的。
使用
-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
}
}
更离奇的答案。如果 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
执行此操作的另一种方法是使用脚本块作为条件。
我需要一种根据文档类型快速加载特定库的方法:
$lib = switch ([System.IO.Path]::GetExtension($File)) {
{$_ -in '.docx', '.doc' } { 'words' }
{$_ -in '.ppt', '.pptx' } { 'slides' }
'pdf' { 'pdf' }
Default { $false }
}
Write-Host $lib