PowerShell命令与脚本(7)——条件判断
PowerShell条件操作符
1、PowerShell中的比较运算符
-eq :等于
-ne :不等于
-gt :大于
-ge :大于等于
-lt :小于
-le :小于等于
-contains :包含
-notcontains :不包含
2、进行比较
可以将比较表达式直接输入进Powershell控制台,然后回车,会自动比较并把比较结果返回。
3、求反
求反运算符为-not 但是像高级语言一样” !“ 也支持求反。
4、布尔运算
-and :与
-or :或
-not :非
-xor :异或
5、比较数组和集合
过滤数组中的元素
验证一个数组是否存在特定元素
Where-Object条件过滤
本篇会对条件判断进行实际应用。在管道中可以通过条件判断过滤管道结果,Where-Object会对集合逐个过滤,将符合条件的结果保留。
过滤管道结果
使用Get-Process返回所有的当前进程 ,但是你可能并不对所有的进程感兴趣,然后通过每个Process对象的属性进行过滤。首先得知道每个对象支持那些属性。
根据进程名过滤所有记事本进程。
根据company过滤所有产品发布者以”Microsoft”打头的进程:
使用别名
因为Where-Object的使用概率比较高,所以有一个很形象的别名“ ?”可以使用:
if elseif else 条件判断
Where-Object 进行条件判断很方便,如果在判断后执行很多代码可以使用IF-ELSEIF-ELSE语句。语句模板:
If(条件满足){
如果条件满足就执行代码
}
Else
{
如果条件不满足
}
条件判断必须放在圆括号中,执行的代码必须紧跟在后面的花括号中。
Switch条件判断
如果语句中有多路分支,使用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