Powershell Switch 条件 6


本文索引
[隐藏]

如果语句中有多路分支,使用IF-ELSEIF-ELSE不友好,可以使用Switch,看起来比较清爽一点。
下面的例子将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"}
}


测试取值范围

使用 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="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,即大小写敏感比较字符串:

$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 选项

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

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

$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语句演示打印水仙花数:

$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://www.pstips.net/powershell-switch-condition.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。


Leave a comment

电子邮件地址不会被公开。 必填项已用*标注

6 thoughts on “Powershell Switch 条件

  • DJ

    你好,我想问一下,我执行了下面这条语句,它的输出是正确的,输出:没有匹配条件
    $value = -1
    switch($value)
    {
    {($_ -lt 10) -and ($_ -gt 0)} {“小于10”}
    {$_ -eq 10} {“等于10”}
    {$_ -gt 10} {“大于10”}
    default {“没有匹配条件”}
    }

    但是我把第四行换成{{$_ -lt 10)} -and {$_ -gt 0}} {“小于10”},执行后,没有报错,但是输出的是“小于10”,我想问一下,这是为什么呢?

    • Mooser Lee 文章作者

      你说的第四行是这个吗?

      {($_ -lt 10) -and ($_ -gt 0)} {“小于10″}

      如果是这行,当你改成

      {{$_ -lt 10)} -and {$_ -gt 0}} {“小于10″}
      

      这是不对的,应当这样写

      {($_ -lt 10) -and ($_ -gt 0)} {“小于10″}
      

      条件用小括号,而不是花括号。

      • DJ

        Sorry, 可能是我描述的不是太清楚,我知道正确的用法是想你说的那样,但是那行错的我运行的时候没有报错,但是输出的是个错误的结果,我是觉得既然不对应该报错, 不应该能运行起来,我想知道是为什么,我自己想了半天也没想明白

        • Mooser Lee 文章作者

          其实在PowerShell中如果你拿着一个非布尔值的对象进行布尔值判断,只要它非null的它就会返回为true的。{}这种写法在PowerShell表示语句块,你都定义了它,它自然非null,类似于:

          PS> $a={8 -lt 99}
          PS> $b={8 -lt 99}
          PS> $a
          8 -lt 99
          PS> $a -and $b
          True
          
  • power

    ^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$
    本文中IP地址正则表达式不对