powershell 逻辑控制语句
顺序结构
从上到下,从左到右运行
$xiaoming = \"I am the most handsome man of the world.\"$xiaoli = \"Bullshit!\"write-output(\"小明说:\"+ xiaoming , xiaoli+ \"小李嫉妒地说道。\")
分支结构
if-elseif-elseif-elseif-if(会执行所有的 if 分支)分支结构嵌套
逻辑运算符
-not --- 非 运算,表达式为true则返回false,反之返回true-or --- 或 运算,有一个表达式为true则返回true-and --- 与 运算,两个表达式均为true才返回true-xor --- 逆或 运算,
关系运算符
-eq --- 检测两个数是否 相等 ,相等返回true。 $a -eq $b-ne --- 检测两个数是否 不相等。-gt --- 检测左边的数是否 大于 右边的数-ge --- 检测左边的数是否 大于等于 右边的数-lt --- 检测左边的数是否 小于 右边的数-le --- 检测左边的数是否 小于等于 右边的数[String]::IsNullOrEmpty(str) --- 判断字符串是否为空-match --- 判断字符串是否匹配给定的正则表达式
正则表达式
^ --- 在字符串的开始匹配. --- 匹配出了换行符之外的任意字符[^abc] --- 匹配除了包含在中括号的任意字符[abc] --- 匹配括号中指定的任意一个字符[a-z] --- 匹配括号中指定的任意区间之中的任意一个字符[^a-z] --- 匹配除了包含在括号指定区间字符的字符\\B --- 不在单词的边界匹配\\Z --- 在字符串的结尾匹配(包含多行文本)\\uFFFF --- 匹配 Unicode 字符的十六进制代码 FFFF。eg:欧元符号的代码20AC\\v --- 匹配纵向制表符(ASCII 11)\\w --- 匹配字符、数字和下划线\\W --- 匹配字符、数字和下划线以外的字符\\a --- 响铃字符(ASCII 7)\\c or \\C ---匹配 ASCII 中的控制字符, eg:Ctrl+C\\d --- 匹配数字字符,等同于[0-9]\\D --- 匹配数字以外的字符,等同于[^0-9]\\e --- Esc (ASCII 9)\\f --- 换页符(ASCII 15)\\n --- 换行符\\r --- 回车符\\s --- 白空格(空格、制表符、新行)\\S --- 匹配(空格、制表符、新行)以外的字符\\t --- 制表符\\A --- 在字符串的开始匹配(包含多行文本)\\b --- 在字符串的边界匹配\\xnn --- 匹配特色字符,nn 代表十六进制的ASCII 码.* --- 匹配任意数量的字符(包括0个字符)* --- 匹配一个元素 0 次或多次(最大限度地匹配)*? --- 匹配前面的元素 0 次或多次(最小限度地匹配)? --- 匹配上一个元素 0 次或 1 次(最大限度地匹配)?? --- 匹配上一个元素 0 次或 1 次(最小限度地匹配){n,} --- 匹配上一个元素至少 n 次{n,m} --- 匹配上一个元素 n~m 次{n} --- 匹配上一个元素 n 次+ --- 匹配上一个元素 1 次或多次$ --- 在字符串的结尾匹配
循环结构
while
while(判断条件){循环语句}
for
for(定义变量;变量判断;变量自增自减){循环语句}
循环控制
Continue --- 退出本次循环Break --- 退出整个循环
练习
- 从键盘输入一个字符,判断这个字符是数字,还是大写字母,还是小写字母,还是符号。
//PowerShell中,String类型不能直接转ASCII码,先转成 char 类型,就可以转成 int 类型Write-Output(\"请输入一个字符:\")[char]$c=Read-Host[int]$int_char = $cif(($int_char -ge 48)-and ($int_char -le 57)){Write-Output(\"这是一个数字\")}elseif(($int_char -ge 65)-and ($int_char -le 90)){Write-Output(\"这是一个大写字母\")}elseif(($int_char -ge 97)-and ($int_char -le 122)){Write-Output(\"这是一个小写字母\")}else{Write-Output(\"这是一个特殊符号\")}
- 统计字符:从键盘输入一个字符串,统计这个字符串当中包含几个大写字母,几个小写字母,几个数字,几个特殊符号。
Write-Output(\"请输入一个字符串:\")$a=Read-Host[char[]]$char_array = $a.ToCharArray()[int]$length = $char_array.Length$sumUp=0$sumLow=0$sumNum=0$sumSpe=0for($i=0;$i -lt $length;$i++){$int_array= [int]($char_array[$i])if(($int_array -ge 65)-and ($int_array -le 90)){$sumUp++}elseif(($int_array -ge 97)-and ($int_array -le 122)){$sumLow++}elseif(($int_array -ge 48)-and ($int_array -le 57)){$sumNum++}else{$sumSpe++}}Write-Output(\"这个字符串中包含{0}个大写字母,{1}个小写字母,{2}个数字及{3}个特殊符号\" -f $sumUp,$sumLow,$sumNum,$sumSpe)
3. 水仙花数:计算三位整数(100~999)的水仙花数。水仙花数是指每一位的立方相加等于该数自己,比如153 = 1^3 + 5^3 +3^3
for($i=100;$i -lt 1000;$i++){[string]$s=$i[int]$bai = $s.SubString(0,1)[int]$shi = $s.SubString(1,1)[int]$ge = $s.SubString(2)if(($bai*$bai*$bai)+($shi*$shi*$shi)+($ge*$ge*$ge) -eq $i){Write-Output(\"这是一个水仙花数:{0}\" -f $i)}}
4. 字符串判断:从键盘输入一个字符串,判断该字符串是否可以被转换为一个有效的数字。
Write-Output(\"请输入一个字符串:\")$s = Read-Host$else = \"[^0-9]\"if($s.Length -eq 1){Write-Output(\"能被转换为一个有效的数字\")}elseif($s.Length -ge 2){if($s -match $else){Write-Output(\"不能被转换为一个有效的数字\")}else{Write-Output(\"能被转换为一个有效的数字\")}}
- 打印99 乘法表。
for($i=1;$i -lt 10;$i++){for($j=1;$j -le $i;$j++){$sum = $i * $jWrite-Host(\"{0} * {1} = {2} \" -f $i,$j,$sum) -nonewline}Write-Output(\"\")}
6. 一个10000 以内整数,它加上100 和加上268 后都是一个完全平方数,请问该数是多少?
for($i=1;$i -lt 10000;$i++ ){for($j=1;$j -lt 100;$j++ ){if(($j*$j) -eq ($i + 100) ){for($k=1;$k -lt 100;$k++ ){if(($k*$k) -eq ($i + 268)){Write-Output($i)}}}}}
- 拆分字符串:“网络空间安全”,拆分成网络、络空、空间、间安、安全
$s=\"网络空间安全\"Write-Output($s.Substring(0,2))Write-Output($s.Substring(1,2))Write-Output($s.Substring(2,2))Write-Output($s.Substring(3,2))Write-Output($s.Substring(4))
8. 对3、65、22、102、4 进行降序排序。
$array_data=3,65,22,102,4for($i=0;$i -lt $array_data.Length - 1;$i++){for($j=0;$j -lt ($array_data.Length-1-$i);$j++){if($array_data[$j+1] -gt $array_data[$j]){$temp=$array_data[$j]$array_data[$j]=$array_data[$j+1]$array_data[$j+1]=$temp}}}Write-Output($array_data)
9. 计算200 以内的所有质数(即只有1 和其自身能够被这个数整除的数),建议使用至少3 种算法实现,看看哪一种算法的运算次数最少。
//方法1:判断比 i 小的数里面是否有 i 的因数,有的话,则不是质数;反之就是质数for($i=2;$i -le 200;$i++){for($j=2;$j -lt $i;$j++){$flag=1if(($i%$j) -eq 0){$flag=0break}}if($flag -eq 1){Write-Output($j)}}
//方法2:对方法1的升级版,不需要对小于 i 的所有数进行判断,因数肯定是两两出现的,且一个小于根号i,一个大于根号i ,故只需要判断根号 i 以内的数for($i=2;$i -le 200;$i++){$genhao=[math]::Sqrt($i)for($j=2;$j -le $genhao;$j++){$flag=1if(($i%$j) -eq 0){$flag=0break}}if(($i -eq 2)-or ($i -eq 3)){ // 两个较小数单独讨论$flag = 1}if($flag -eq 1){Write-Output($i)}}
10.设定的总行数line 可以随机修改,修改后仍然能打印出line 行的直角三角形。
打印如下两种三角形图形:
for($i=1;$i -lt 6;$i++){for($j=0;$j -lt $i;$j++){Write-Host \"*\" -NoNewline}Write-Output(\"\")}
for($i=1;$i -lt 6;$i++){for($j=6-$i;$j -gt 1;$j--){Write-Host \" \" -NoNewline}for($k=0;$k -lt ($i+$i-1);$k++){Write-Host \"*\" -NoNewline}Write-Output(\"\")}