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
|