PowerShell命令与脚本(8)——循环
ForEach-Object循环
Powershell管道就像流水线,对于数据的处理是一个环节接着一个环节,如果你想在某一环节对流进来的数据逐个细致化的处理,可是使用ForEach-Object,$_ 代表当前的数据。
1、对管道对象逐个处理
如果使用Get-WmiObject 获取系统中的服务,为了排版可能会也会使用Format-Table对结果进行表格排版。
但是如果想对每个服务进行更定制化的处理可是使用ForEach-Object
2、结合条件处理
ForEach-Object的处理可以包含任意Powershell脚本,当然也包括条件语句
Get-WmiObject Win32_Service | ForEach-Object{
if($_.ProcessId -gt 3000)
{"{0}({1})" -f $_.DisplayName,$_.ProcessId}
}
3、调用方法
在ForEach-Object中,$_代表当前对象,当然也允许通过$_,调用该对象支持的方法。
下面的例子杀死所有IE浏览器进程:
Do While循环
Do和While可能产生死循环,为了防止死循环的发生,你必须确切的指定循环终止的条件。指定了循环终止的条件后,一旦条件不满足就会退出循环。
单独使用While
$n=5
while($n -gt 0)
{
$n
$n=$n-1
}
#5
#4
#3
#2
#1
终止当前循环
使用continue关键字,可是终止当前循环,跳过continue后其它语句,重新下一次循环。
$n=1
while($n -lt 6)
{
if($n -eq 4)
{
$n=$n+1
continue
}
else
{
$n
}
$n=$n+1
}
#1
#2
#3
#5
跳出循环语句
跳出循环语句使用break关键字
$n=1
while($n -lt 6)
{
if($n -eq 4)
{
break
}
$n
$n++
}
For循环
如果你知道循环的确切次数可以使用For循环,For循环属于计数型循环,一旦达到最大次数,循环就会自动终止。下面的例子通过循环求1-100的数列和。
$Sum=0
For($i=1;$i -le 100;$i++)
{
$sum+=$i
}
$sum
For循环是特殊类型的While循环
在For循环开始的圆括号中,由分号隔开的语句为循环的控制条件,分别为:初始化,循环执行满足的条件,增量。
For循环的控制语句第一个和第三个可以为空:
$sum=0
$i=1
for(;$i -le 100;)
{
$sum+=$i
$i++
}
$sum
For循环的特殊应用
上面的For循环示例停留在数字层面上,其实While循环能办到的事,For循环也可以,只是可能有时不方便而已。例如判断域名的例子:
for($domain="";!($domain -like "www.*.*");$domain=Read-Host "Input domain")
{
Write-Host -ForegroundColor "Green" "Please give a valid domain name."
}
下面的例子演示逐行读取文本文件
for($file=[IO.File]::OpenText("D:\game\test.txt") ; !($file.EndOfStream);$line=$file.ReadLine() )
{
$line;
}
$file.Close()
Switch循环
Switch 本是多路分支的关键字,但是在Powershell中由于Switch支持集合,所以也可以使用它进行循环处理。下面举两个例子。
#使用Foreach循环
$nums=10..7
foreach($n in $nums)
{
"n=$n"
}
n=10
n=9
n=8
n=7
#使用Switch循环
$nums = 10..7
Switch ($nums)
{
Default { "n= $_" }
}
n= 10
n= 9
n= 8
n= 7
有时对集合的处理,在循环中还须条件判断,使用Switch循环可以一部到位,例如:
$nums = 10..7
Switch ($nums)
{
{($_ % 2) -eq 0} {"$_ 偶数"}
{($_ % 2) -ne 0} {"$_ 奇数"}
}
10 偶数
9 奇数
8 偶数
7 奇数