Powershell Switch 条件 6
如果语句中有多路分支,使用IF-ELSEIF-ELSE不友好,可以使用Switch,看起来比较清爽一点。
下面的例子将If-ElseIF-Else转换成Switch语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
# 使用 IF-ElseIF-Else If ( $value -eq 1 )
{ "Beijing"
} Elseif ( $value -eq 2)
{ "Shanghai"
} Elseif ( $value -eq 3 )
{ "Tianjin"
} Else { "Chongqing"
} # 使用 Switch switch ( $value )
{ 1 { "Beijing" }
2 { "Shanghai" }
3 { "Tianjin" }
4 { "Chongqing" }
} |
1
|
|
测试取值范围
使用 Switch 时缺省的比较运算符为 -eq 等于,你也可以自己定制比较条件,将条件放在花括号中,必须保证条件表达式的返回值为布尔类型”$True”或”$False”
1
2
3
4
5
6
7
8
9
10
|
$value =18
# 使用 Switch 测试取值范围 switch ( $value )
{ { $_ -lt 10} { "小于10" }
10 { "等于10" }
{ $_ -gt 10} { "大于10" }
} #输出 #大于10 |
没有匹配条件
在IF-Else语句中如果没有合适的条件匹配,可以在Else中进行处理,同样在Switch语句中如果case中没有条件匹配,可以使用关键字Default进行处理。
同样是上面的例子,稍加修改:
1
2
3
4
5
6
7
8
9
10
11
|
$value =-7
# 使用 Switch 测试取值范围 switch ( $value )
{ {( $_ -lt 10) -and ( $_ -gt 0) } { "小于10" }
10 { "等于10" }
{ $_ -gt 10} { "大于10" }
Default { "没有匹配条件" }
} #Output: #没有匹配条件 |
多个条件匹配
如果case中有多个条件匹配,那么每个匹配的条件都会进行处理,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$value =2
# 使用 Switch 测试取值范围 switch ( $value )
{ { $_ -lt 5 } { "小于5" }
{ $_ -gt 0 } { "大于0" }
{ $_ -lt 100}{ "小于100" }
Default { "没有匹配条件" }
} #小于5 #大于0 #小于100 |
如果碰到匹配条件时只处理一次,可以使用Break关键字
1
2
3
4
5
6
7
8
9
10
11
|
$value =99
# 使用 Switch 测试取值范围 switch ( $value )
{ { $_ -lt 5 } { "小于5" ; break }
{ $_ -gt 0 } { "大于0" ; break }
{ $_ -lt 100} { "小于100" ; break }
Default { "没有匹配条件" }
} #大于0 |
比较字符串
之前的条件比较的都是数字,接下来比较字符串,默认的条件判断为-eq ,我们知道在Powershell中字符串的使用-eq比较大小写不敏感,所以才有下面的例子:
1
2
3
4
5
6
7
8
9
10
|
$domain = "www.mossfly.com"
switch ( $domain )
{ "Www.moSSfly.com" { "Ok 1" }
"www.MOSSFLY.com" { "Ok 2" }
"WWW.mossfly.COM" { "Ok 3" }
} Ok 1 Ok 2 Ok 3 |
大小写敏感
怎样在比较字符串时能够恢复为大小写敏感模式,Switch有一个-case 选项,一旦指定了这个选项,比较运算符就会从-eq 切换到 -ceq,即大小写敏感比较字符串:
1
2
3
4
5
6
7
8
9
|
$domain = "www.mossfly.com"
#大小写敏感 switch -case ( $domain )
{ "Www.moSSfly.com" { "Ok 1" }
"www.MOSSFLY.com" { "Ok 2" }
"www.mossfly.com" { "Ok 3" }
} #Ok 3 |
使用通配符
字符串非常特殊,可是使用通配符,幸运的是Powershell也支持,果然Power啊。但是在Switch语句后要指定 -wildcard 选项
1
2
3
4
5
6
7
8
9
10
11
|
$domain = "www.mossfly.com"
#使用通配符 switch -wildcard ( $domain )
{ "*" { "匹配'*'" }
"*.com" { "匹配*.com" }
"*.*.*" { "匹配*.*.*" }
} 匹配 '*'
匹配*.com 匹配*.*.* |
在字符串匹配中,比通配符功能更强大是正则表达式,Powershell的Switch语句也支持,真是太棒了。当然需要给Switch关键字指定选项-regex
1
2
3
4
5
6
7
8
9
10
11
|
$mail = "www@mossfly.com"
#使用通配符 switch -regex ( $mail )
{ "^www" { "www打头" }
"com$" { "com结尾" }
"d{1,3}.d{1,3}.d{1,3}.d{1,3}" { "IP地址" }
} #www打头 #com结尾 |
同时处理多个值
Switch支持对集合所有元素进行匹配,下面的例子使用Powershell Switch语句演示打印水仙花数:
1
2
3
4
5
6
7
8
9
10
|
$value =100..999
switch ( $value )
{ { [Math] ::Pow( $_ % 10,3)+ [Math] ::Pow( [Math] ::Truncate( $_ % 100/10) ,3)+ [Math] ::Pow( [Math] ::Truncate( $_ /100) , 3) -eq $_ } { $_ }
} #153 #370 #371 #407 |
本文链接: http: