欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Windows Powershell Switch 语句

程序员文章站 2022-06-17 22:50:12
下面的例子将if-elseif-else转换成switch语句 复制代码 代码如下: # 使用 if-elseif-else if( $value -eq 1 )...

下面的例子将if-elseif-else转换成switch语句

复制代码 代码如下:

# 使用 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”

复制代码 代码如下:

$value=18
# 使用 switch 测试取值范围
switch($value)
{
    {$_ -lt 10} {"小于10"}
    10  {"等于10"}
    {$_  -gt 10} {"大于10"}
}
#输出
#大于10

没有匹配条件

在if-else语句中如果没有合适的条件匹配,可以在else中进行处理,同样在switch语句中如果case中没有条件匹配,可以使用关键字default进行处理。
同样是上面的例子,稍加修改:

复制代码 代码如下:

$value=-7
# 使用 switch 测试取值范围
switch($value)
{
    {($_ -lt 10) -and ( $_ -gt 0) }  {"小于10"}
    10  {"等于10"}
    {$_  -gt 10} {"大于10"}
    default {"没有匹配条件"}
}
#output:
#没有匹配条件

多个条件匹配

如果case中有多个条件匹配,那么每个匹配的条件都会进行处理,例如:

复制代码 代码如下:

$value=2
# 使用 switch 测试取值范围
switch($value)
{
    {$_ -lt 5 }  { "小于5" }
    {$_ -gt 0 }   { "大于0" }
    {$_ -lt 100}{ "小于100"}
    default {"没有匹配条件"}
}
 
#小于5
#大于0
#小于100

如果碰到匹配条件时只处理一次,可以使用break关键字

复制代码 代码如下:

$value=99
# 使用 switch 测试取值范围
switch($value)
{
    {$_ -lt 5 }   { "小于5"; break}
    {$_ -gt 0 }   { "大于0"; break}
    {$_ -lt 100}  { "小于100"; break}
    default {"没有匹配条件"}
}
 
#大于0

比较字符串

之前的条件比较的都是数字,接下来比较字符串,默认的条件判断为-eq ,我们知道在powershell中字符串的使用-eq比较大小写不敏感,所以才有下面的例子:

复制代码 代码如下:

$domain=""
switch($domain)
{
    "www.jb51.net" {"ok 1"}
    "www.jb51.net" {"ok 2" }
    "www.jb51.net" {"ok 3"}
}
ok 1
ok 2
ok 3

大小写敏感

怎样在比较字符串时能够恢复为大小写敏感模式,switch有一个-case 选项,一旦指定了这个选项,比较运算符就会从-eq 切换到 -ceq,即大小写敏感比较字符串:

复制代码 代码如下:

$domain=""
#大小写敏感
switch -case ($domain)
{
    "www.jb51.net" {"ok 1"}
    "www.jb51.net" {"ok 2" }
    "" {"ok 3"}
}
#ok 3

使用通配符

字符串非常特殊,可是使用通配符,幸运的是powershell也支持,果然power啊。但是在switch语句后要指定 -wildcard 选项

复制代码 代码如下:

$domain=""
#使用通配符
switch -wildcard($domain)
{
    "*"     {"匹配'*'"}
    "*.net" {"匹配*.net" }
    "*.*.*" {"匹配*.*.*"}
}
匹配'*'
匹配*.net
匹配*.*.*

在字符串匹配中,比通配符功能更强大是正则表达式,powershell的switch语句也支持,真是太棒了。当然需要给switch关键字指定选项-regex

复制代码 代码如下:

$mail=""
#使用通配符
switch -regex ($mail)
{
    "^www"     {"www打头"}
    "net$"     {"net结尾" }
    "d{1,3}.d{1,3}.d{1,3}.d{1,3}" {"ip地址"}
}
 
#www打头
#net结尾

同时处理多个值

switch支持对集合所有元素进行匹配,下面的例子使用powershell switch语句演示打印水仙花数:

复制代码 代码如下:

$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