在本文中,我们将回顾 PowerShell For 循环、While 循环、Do-While 循环和Do-Until 循环。我将解释 PowerShell 循环是如何构建的,以及如何定义条件进入或退出循环。
PowerShell For 循环
这个 For 循环 是一个计数循环,当您需要重复执行一定次数的任务、处理集合或按索引号指定项时,它通常被使用。它在条件测试评估为 true 时重复,并在 false 时退出。

For 循环的语法如下:
for (<Init>; <Condition>; <Repeat>) { <Script Block> }
- <Init> 区块在循环开始前执行一个命令或一组命令。通常在这里初始化计数变量。
- 在 <Condition> 部分,您评估条件测试。如果为 true,您将进入循环并执行脚本区块中的命令。然后,条件将被再次评估,直到结果为 false。
- <Repeat> 占位符在每次循环迭代中执行一个或多个以逗号分隔的命令。通常用于修改计数变量。
如果您想要重复执行一个特定操作五次,请使用以下示例:
了解存储在何处的敏感数据,评估相关风险,并使用DataSecurity Plus,ManageEngine的数据保护软件实施基于策略的数据保护措施。立即开始使用全功能的30天免费试用版。
for ($var = 1; $var -le 5; $var++) { Write-Host The value of Var is: $var } Write-Host End of for loop.

这里,变量被初始化为1,小于5,因此您将进入循环并执行脚本块。在每次迭代中,变量的值递增1,并根据条件进行评估,直到结果为false。
由于条件在开始时进行评估,如果结果为false,则不会执行命令块:
for ($var = 6; $var -le 5; $var++) { Write-Host The value of Var is: $var } Write-Host End of for loop.

如果需要,可以使用逻辑运算符指定更多条件。在这种情况下,我们添加了多个条件。由于逻辑运算符-and仅在两个条件都是true时才结果为true,当表达式$var -ne 3达到false状态时,循环停止。
for ($var = 1; $var -le 5 -and $var -ne 3; $var++) { Write-Host The value of Var is: $var } Write-Host End of for loop.

如前所述,您可以在<Init>和<Repeat>占位符中执行一个或多个命令。在下面的示例中,我们有一个变量$var1,初始值为1,递增,并评估其值以检查它是否小于或等于5。
然而,我们还有第二个变量$var2。它的初始值为5,递减,但不作为条件的一部分进行评估。
for (($var1 = 1), ($var2 = 5); $var1 -le 5; ($var1++), ($var2--)) { Write-Host The value of Var1 is: $var1 Write-Host The value of Var2 is: $var2 } Write-Host End of for loop.

如何定义PowerShell循环条件
在PowerShell中,命令是按顺序执行的。但有时,您可能需要重复执行一个命令或一组命令,直到满足特定条件。这被称为循环。
要定义在PowerShell中进入或退出循环的条件,您需要使用比较运算符。它们允许您比较值或找到与特定模式匹配的值。结果是一个布尔值(true或false),由循环逻辑评估。
您可以使用比较运算符比较数值:
Operation | Result |
2 -eq 2 | True |
2 -eq 5 | False |
3 -gt 7 | True |
5 -lt 3 | False |
您还可以使用比较运算符比较字符串值:
了解存储在何处的敏感数据、评估相关风险,并通过DataSecurity Plus实施基于策略的数据保护措施,DataSecurity Plus是ManageEngine的数据保护软件。立即开始使用完全功能齐全的30天免费试用版。
Operation | Result |
‘PowerShell’ -eq ‘powershell’ | True |
‘PowerShell’ -eq ‘cmd’ | False |
‘PowerShell’ -like ‘power*’ | True |
‘PowerShell’ -notlike ‘*shell’ | False |
PowerShell Foreach循环
Foreach循环用于遍历集合中的项目。在这种情况下,您没有条件需要评估,但循环会重复进行,直到集合中的所有项目都被处理。
<Figure Foreach_Diagram.png> The syntax for a Foreach loop is the following: foreach ($<item> in $<collection) { <Script Block> }
在这里,我们从foreach语句开始,后面跟着括号内有一个变量和一个要迭代的集合。然后是要执行的脚本块。变量是自动生成的,并且在循环的每次执行之前从数组中分配一个值。
同样,要运行五次循环,您需要一个包含五个项目的集合。在这种情况下,这些将是从1到5的整数值:
$collection = 1..5 foreach ($item in $collection) { Write-Host The value of Item is: $item } Write-Host End of foreach loop

变量使用集合的第一个值1初始化,然后执行脚本块。在下一次迭代中,变量将被分配下一个数组中的项目,即2。脚本块将一遍又一遍地处理,直到集合中的所有项目都被处理。
例如,如果您想处理计算机上正在运行的前五项服务,您的循环将如下所示:
foreach ($service in (Get-Service | Select-Object -First 5)) { Write-Host Service name is: $service.name and status is $service.status }

您应该明白Foreach循环与命令Foreach-Object之间有所不同。很容易混淆它们。Foreach循环始终以Foreach语句开头,而Foreach-Object命令将在处理通过它发送的对象时跟随具有管道的命令。
PowerShell While loop
PowerShell中的While语句用于创建一个循环,如果条件评估为true,则运行一个命令或一组命令。它在执行脚本块之前检查条件。只要条件是true,PowerShell将执行脚本块,直到条件导致false。

while循环的语法如下:
while (<Condition>){<Script Block>}
例如,如果您有一个名为var的变量,初始值为1,并且希望重复循环五次,则循环应该遵循这种结构:
了解敏感数据存储在何处,评估与之相关的风险,并使用DataSecurity Plus这款ManageEngine数据保护软件实施基于策略的数据保护措施。立即开始使用完全功能齐全的30天免费试用版。
$var = 1 while ($var -le 5) { Write-Host The value of Var is: $var $var++ } Write-Host End of While loop.

在上面的示例中,变量在循环外初始化,并在脚本块中递增。使用Write-Host命令在循环的每个周期中输出变量的值。
请注意,如果条件初始为false,那么循环将不会被触发。在我们的例子中,如果我们为变量赋值(var = 6),那么循环命令将完全不起作用,脚本块也不会被执行。
$var = 6 while ($var -le 5) { Write-Host The value of Var is: $var $var++ } Write-Host End of While loop.

您可以使用逻辑运算符来构建更复杂的条件。例如,如果您希望变量小于5且不等于3,则循环应该如下所示:
$var = 1 while ($var -le 5 -and $var -ne 3) { Write-Host The value of Var is: $var $var++ } Write-Host End of While loop.

正如前面提到的,当使用逻辑运算符-and时,仅当两个条件测试均评估为true时,结果才为true。在这种情况下,当变量被赋值为3时,第二个条件变为false:这导致一个false的结果,从而停止循环。
PowerShell Do-While循环
A Do-While loop is a variant of the While loop, and the main difference is that the script block is executed before the condition is checked. This means that even if the start condition is false, the script block will be executed at least once.

Do-While循环的语法如下:
do { <script block> } while (<condition>)
因此,如果我们使用与之前相同的例子,代码将如下所示:
$var = 1 do { Write-Host The value of Var is: $var $var++ } while ($var -le 5) Write-Host End of Do-While loop.

让我们执行一个带有变量var = 6的Do-While循环。在这里,循环将在检查条件为false之前执行一次。
$var = 6 do { Write-Host The value of Var is: $var $var++ } while ($var -le 5) Write-Host End of Do-While loop.

再次,使用逻辑运算符也是可能的。如果使用与之前相同的例子,您会发现当变量的值为3时,循环会停止,因为我们希望我们的变量小于5且不等于3:
了解存储在哪里的敏感数据,评估与其相关的风险,并使用DataSecurity Plus实施基于策略的数据保护措施,这是ManageEngine的数据保护软件。立即开始使用功能完整的30天免费试用版。
$var = 1 do { Write-Host The value of Var is: $var $var++ } while ($var -le 5 -and $var -ne 3) Write-Host End of Do-While loop.

PowerShell Do-Until循环
Do-Until循环的工作方式与Do-While循环相同:首先运行脚本块,然后评估条件。区别在于,虽然Do-While循环在具有true条件的情况下进入循环,但Do-Until循环会寻找false条件来进入循环。

Do-Until循环的语法如下:
do { <script block> } until (<condition>)
正如您所看到的,结构几乎与Do-While循环相同。但是,让我们看看如果继续使用之前的示例会得到什么结果:
$var = 1 do { Write-Host The value of Var is: $var $var++ } until ($var -le 5) Write-Host End of Do-Until loop.

由于条件测试评估为true,因此Do-Until循环不会触发,因为我们需要一个false结果来进入循环。在这种情况下,如果要重复循环5次,逻辑运算符需要更改为greater than (-gt),这将为前5次迭代提供一个false结果:
$var = 1 do { Write-Host The value of Var is: $var $var++ } until ($var -gt 5) Write-Host End of Do-Until loop.

同样,由于我们需要初始条件为false才能进入并保持在循环中,如果我们需要定义更复杂的表达式,这也会影响逻辑运算符。
在以下示例中,我们必须使用-or运算符来使循环重复直到我们的变量大于 5(所需的假结果)或等于 3。我们不能使用-and运算符,因为那将要求变量同时大于 5 和等于 3,这样会导致无限循环。
$var = 1 do { Write-Host The value of Var is: $var $var++ } until ($var -gt 5 -or $var -eq 3) Write-Host End of Do-Until loop.

如何控制 PowerShell 循环
您可以使用关键字控制循环中的执行流程,以便在不评估条件的情况下退出循环或跳过循环的当前迭代。尽管有时这些关键字可能很有用,但并不总是推荐使用,因为它们可能会使脚本难以阅读。
break语句
break语句立即停止并退出当前循环,而不执行循环的脚本块中其余的代码,也不评估指定的条件。这使得 PowerShell 可以继续执行剩余的代码。
break关键字的行为与所使用的循环类型无关。使用上述其中一个示例,我们将从 1 计数到 5,并在计数变量等于三时退出循环。但是这次,我们将添加一个break,而不是在测试条件中使用逻辑运算符。
了解存储在哪里的敏感数据,评估与之相关的风险,并使用DataSecurity Plus,ManageEngine的数据保护软件实施基于策略的数据保护措施。立即开始使用功能齐全的30天免费试用版。
为实现这一目标,将使用if语句来定义退出标准。
For ($var = 1; $var -le 5; $var++) { if ($var -eq 3) {break} Write-Host The value of Var is: $var } Write-Host End of for loop.

当计数变量的值等于3时,if语句被触发并执行关键字break。由于break关键字位于Write-Host命令之前的脚本块中,后者将不会被处理。循环停止,脚本继续执行其余代码。
continue语句
continue语句允许您跳过代码的剩余部分,返回到循环的开头而不退出。
与前面的示例一样,将使用一个For循环,但这次,PowerShell会在计数变量达到3时跳过当前迭代的剩余代码,并继续执行循环,直到条件测试为false。
for ($var = 1; $var -le 5; $var++) { if ($var -eq 3) {Continue} Write-Host The value of Var is: $var } Write-Host End of for loop.

正如您可能已经注意到的那样,当变量的值等于3时,触发了if语句,执行continue语句。然后跳过循环内部的其余代码而不中断它。
结论
PowerShell支持各种类型的循环,了解它们如何帮助您简化脚本并重复某些操作是非常重要的。我们在Petri上广泛涵盖了PowerShell的技巧和技巧,因此请务必查看我们关于如何编写PowerShell脚本以及如何使用ForEach Parallel选项的其他指南。
相关文章:
Source:
https://petri.com/how-to-use-powershell-for-while-loops/