PowerShell的流程控制语句有:
- 分支
- if
- switch
- 循环
- for
- foreach
- while
- 跳转
- break
- continue
1.1 if
语法
以下示例说明 If 语句的语法:
if (<test1>)
{<statement list 1>}
[elseif (<test2>)
{<statement list 2>}]
[else
{<statement list 3>}]
示例: if ($a -gt 2)
{
Write-Host "The value $a is greater than 2."
}
elseif ($a -eq 2)
{
Write-Host "The value $a is equal to 2."
}
elseif ($a -eq 3)
{
Write-Host "The value $a is equal to 3."
}
else
{
Write-Host "The value $a is less than 2 or was not created or initialized."
}1.2 switch
如果要通过 switch 获取的值是一个数组,那么将从元素 0 开始按顺序计算该数组中的每个元素。至少必
须存在满足至少一个条件的元素,否则将发生错误。如果存在多个默认子句,将发生错误。
完整的 switch 语法如下:
switch [-regex|-wildcard|-exact][-casesensitive] ( pipeline )
或
switch [-regex|-wildcard|-exact][-casesensitive] -file filename
后跟
{
"string"|number|variable|{ expression } { statementlist }
default { statementlist }
}
默认情况下,如果未使用任何参数,那么 Switch 按采用"不区分大小写的精确匹配"进行操作。如果
"pipeline"的结果为数组,那么将从 0(零)开始按偏移升序依次对数组中的每个元素进行计算。
Switch 代码块中必须至少存在一个条件元素,并且只能存在一个 default 子句。如果存在多个
default 子句,将引发 ParseException 异常。
Switch 具有以下参数:
Regex 指示如果匹配子句为字符串,则将其视为正则表达式字符串。使用
此参数将禁用 Wildcard 和 Exact。如果匹配子句不是字符串,将忽略此参数。
Wildcard 指示如果匹配子句为字符串,则将其视为通配符字符串。使用此参数将禁用 Regex 和
Exact。如果匹配子句不是字符串,将忽略此参数。
Exact 指示如果匹配子句为字符串,则必须精确匹配。使用此参数将禁用 Wildcard 和 Regex。
如果匹配子句不是字符串,将忽略此参数。
CaseSensitive 如果匹配子句为字符串,则将它修改为区分大小写。如果匹配子句不是字符串,将忽略此参数。
File 从文件(或样本)而不是从语句获取输入。如果使用了多个 File 参数,
则使用最后一个参数。读取文件中的每一行,并对其执行 switch 块。
允许多次使用 Regex、Wildcard 或 Exact。但是,只有使用的最后一个参数控制 Switch 的行为。
一条 switch 语句实际上等效于一系列 If 语句。它将表达式与每个条件逐一进行匹配。如果找到匹配项,即执行与该条件相关联的操作。基本的 switch 语句形式如下(很奇怪的看到不需要break):PS> $a = 3 PS> switch ($a) { 1 {"It is one."} 2 {"It is two."} 3 {"It is three."} 4 {"It is four."} } It is three.这一简单的示例获取一个值,并将该值与列表中的每个条件进行比较。执行的操作是根据匹配情况 回显一个字符串。但是,如果每个条件都检查,可能会遇到问题。例如(这个更奇怪,居然可以有相同的expression): PS> $day = "day5" PS> switch ($day){ day1 {"Monday"; break} day2 {"Tuesday"; break} day3 {"Wednesday"; break} day4 {"Thursday"; break} day5 {"Friday"; break} day6 {"Saturday"; break} day7 {"Sunday"; break} day5 {"Too many days"; break} } Friday 可以使用CaseSensitive区分大小写:PS> $day = "Day5" PS> switch -CaseSensitive ($day){ day1 {"Monday"} day2 {"Tuesday"} day3 {"Wednesday"} day4 {"Thursday"} Day5 {"Friday"} day6 {"Saturday"} day7 {"Sunday"} day5 {"Too many days"} }Friday正则表达式匹配:PS> $day = "day5" PS> switch -regex ($day){ ^[a-z]+$ {"字母,匹配为:" + $_; break} ^[\d]+$ {"数字,匹配为:" + $_; break} ^\w+$ {"字母+数字,匹配为:" + $_; break} } 字母+数字,匹配为:day5正则表达式匹配多个:
$day = "day5","day6" switch -regex ($day){ ^[a-z]+$ {"字母,匹配为:" + $_; } ^[\d]+$ {"数字,匹配为:" + $_; } ^\w+$ {"字母+数字,匹配为:" + $_; } } 字母+数字,匹配为:day5 字母+数字,匹配为:day6通配符(*)匹配:
$day = "day5" switch -Wildcard ($day){ day2 {"day2,匹配为:" + $_; } day3 {"day3,匹配为:" + $_; } day* {"通配符,匹配为:" + $_; } }通配符,匹配为:day5
2.1 for
语法
下面显示了 For 语句的语法。
for (<init>; <condition>; <repeat>)
{<statement list>}
示例:
for($i=1; $i -le 10; $i++){Write-Host $i}
没有什么特别的地方
2.2 foreach
语法
下面显示了 Foreach 语法:
foreach ($<item> in $<collection>){<statement list>}
示例:
$letterArray = "a","b","c","d"
foreach ($letter in $letterArray)
{
Write-Host $letter
}
命令管道之内的 Foreach 语句 当 Foreach 出现在命令管道中时,Windows PowerShell 将使用 foreach 别名调用 ForEach-Object 命令。 在命令管道中使用 foreach 别名时,无需像在 Foreach 语句中那样包含 ($<item> in $<collection>) 语法。 这是因为管道中的前一命令已提供此信息。在命令管道中使用的 foreach 别名的语法如下: <command> | foreach {<command_block>}示例:"a","b","c","d" | foreach { write-host $_ }foreach 别名还支持起始命令块、中间命令块和结尾命令块。起始命令块和结尾命令块只运行一 次,而中间命令块在每次 Foreach 循环访问一次集合或数组时都运行一次。 Foreach 别名在具有起始、中间和结尾命令块组的命令管道中使用时的语法为: <command> | foreach {<beginning command_block>}{<middle command_block>}{<ending command_block>} 以下示例演示了起始、中间和结尾命令块的用法。"a","aa","b","bb","c" | foreach { $x=$y=0} { if ($_.length -eq 1) { $x++ } else { $y++ } } { write-host "$x --- $y" }
2.3 while
下面说明 While 语句的语法:
while (<condition>){<statement list>}
示例: while($val -ne 3)
{
Write-Host $val
$val++
}
下面说明 do While 语句的语法:
do{<statement list>}while (<condition>)
示例: do{
Write-Host $val
$val++
}while($val -ne 3)
下面说明 While 语句的语法:
while (<condition>){<statement list>}
示例: do
{
Write-Host $val
$val++
}until($val -gt 3)3.1 break
当 Break 语句出现在如 Foreach、For、Switch 或 While 等循环中时,该 Break 语句将使
Windows PowerShell 立即退出该循环。在不循环的 Switch 构造中,Break 语句将使 Windows
PowerShell 退出 Switch 代码块。
以下面的 Foreach 语句为例:
$i=0
$varB = 10,20,30,40
foreach ($val in $varB)
{
$i++
if ($val -eq 30)
{
break
}
}
退出其他循环语句与退出 Foreach 循环的方式完全相同。在以下示例中,在使用 Trap 语句捕获到
DivideByZeroException 异常后,Break 语句将使程序退出 While 语句。
$i = 3
while ($true)
{
trap [DivideByZeroException]
{
Write-Host "divide by zero trapped" break
}
1 / $i--
}
Break 语句可以包含标签。如果将 Break 关键字与标签一起使用,Windows PowerShell 将退出
带标签的循环而不是退出当前循环。标签的语法如下(此示例演示了 While 循环中的一个标签):
:myLabel while (<condition>) { <statement list>}
标签的格式是冒号加您指定的名称。标签必须是语句中的第一个标记,后面必须跟随循环关键字(如
While)。
在 Windows PowerShell 中,只有循环关键字(如 Foreach、For 和 While)可以带标签。
Break 将语句的执行移到带标签的循环之外。在嵌套循环中,这将产生与单用 Break 关键字不同的
结果。以下结构性示例中的 While 语句含有一个 For 语句:
:myLabel while (<condition 1>)
{
for ($item in $items)
{
if (<condition 2>) { break myLabel }
$item = $x # A statement inside the For-loop }
}
如下面的结构性示例所示,您可以嵌套多个带标签的循环。
:red while (<condition1>)
{
:yellow while (<condition2>)
{
while (<condition3>)
{
if ($a) {break}
if ($b) {break red}
if ($c) {break yellow}
}
# After innermost loop
}
# After "yellow" loop
}
# After "red" loop
3.2 Continue
在脚本中,Continue 语句使程序流立即返回到由 For、Foreach 或 While 语句控制的最内层循
环的顶部。
Continue 关键字支持标签。标签是为脚本语句指定的名称。有关标签的信息,请参阅
about_Break。
在下面的示例中,如果变量 $ctr 等于 5,则程序流返回到 While 循环的顶部。因此,将显示
从 1 到 10 之间的所有数字(除 5 之外):
while ($ctr -lt 10)
{
$ctr +=1
if ($ctr -eq 5) {continue}
Write-Host $ctr
}
本文地址:http://www.cnblogs.com/lwme/archive/2010/04/28/1723283.html
内容整理自MSDN:http://technet.microsoft.com/zh-cn/library/dd347616.aspx
令人崩溃的样式-_-