PowerShell While循环:基础指南

PowerShell是一种强大的脚本语言,提供了许多自动化和管理基于Windows的系统的功能。其中最常用的结构之一是PowerShell的`while`循环。

如果您在学习PowerShell脚本时陷入无尽循环中,不用担心。让PowerShell的`while`循环引导您走向解脱之路。在本教程中,您将回到使用PowerShell编写脚本时与`while`循环一起工作的基础知识。

继续阅读,将您的PowerShell脚本技能提升到下一个水平!

先决条件

本教程将进行实际演示。要跟着做,请确保您具备以下条件:

  • A Windows machine – This tutorial uses Windows 10.
  • 已安装Windows PowerShell 5.0或更高版本 – 本教程使用PowerShell 7。
  • A user account with administrator privileges.

执行单条件`while`循环

`while`循环中最简单的一种类型是单条件类型。与`If`语句不同,此类型的循环执行一组给定的命令,只要指定的条件评估为true。当返回“False”时,循环中断,并且继续执行脚本的其余部分。

以下是单条件 while 循环的语法:

  • 首先要注意的是使用了括号。条件必须用括号括起来,而代码块是一组PowerShell命令,在条件为真时执行。
  • 第二点要注意的是,条件必须返回布尔值,即评估为True或False。
while (condition)
{

	# 要执行的代码块

}

运行以下代码,其中 $val 的值从 0 开始,并每次代码块运行时递增 1,直到 $val 变量的值等于 3 为止。

$val 达到 3 的值时,使条件为False,循环中断,并继续执行脚本的其余部分。

# 使用初始值为0声明$val变量
$val = 0

# 设置while循环以运行,直到$val变量的值达到3
while($val -ne 3)
{
	# 将$val变量的值增加1
	$val++
	
	# 打印$val变量的当前值
	Write-Host $val
}
Understanding Single Condition While Loops.

使用内置变量($true/$false)执行 PowerShell While 循环

在前面的示例中,使用while循环中的条件是有效的。但是,您也可以使用 PowerShell 的内置变量,如$true$false,来创建While循环。

下面的语法执行,直到$true不再是$true为止。换句话说,循环会永远运行。但是,您必须始终包含一种方法来跳出无限循环。否则,您将永远卡住。您将在本教程后面学习如何使用breakcontinue来跳出循环。

while($true)
{

	# 要执行的代码块

}

执行下面的代码块,它将永远运行,将$i的值打印到控制台。

# 声明具有初始值为0的$i变量
$i = 0

# 设置While循环以在条件为$true时运行
while($true)
{
	# 将$i值增加1
	$i++
	
	# 打印$i变量的当前值
	Write-Host $i
}

现在,按Ctrl+C来跳出循环。此循环会消耗许多系统资源,因此在使用时要小心。

Executing a while loop with PowerShell’s built-in ($true) variable

执行多条件While循环

除了单条件while循环外,您还可以创建多条件while循环。与单条件while循环类似,条件必须返回布尔值,即True或False。

以下是多条件while循环的语法,类似于单条件while循环的语法。主要区别在于您可以包含多个由以下运算符分隔的条件:

  • AND(-and)- 两个条件都必须为真。
  • OR(-or)(任一条件都可以为真)。
# AND运算符
while (condition1 -AND condition2)
{

	# 要执行的代码块

}

# OR运算符
while (condition1 -OR condition2)
{

	# 要执行的代码块

}

执行以下代码,当$val不等于3-and$i不等于5时循环。

当两个变量的值达到各自的条件时,循环中断,并继续执行脚本的其余部分。

# 声明$val和$i变量,初始值为0
$val = 0
$i = 0

# 设置While循环,直到$val等于3且$i等于5为止
while($val -ne 3 -and $i -ne 6)
{
	# 将$val增加1
  $val++
	# 将$i增加2
  $i += 2
	# 打印$val和$i变量的当前值
  Write-Host "$val, $i"
}

执行带有AND运算符的while循环

Executing a while loop with AND operator

现在,执行下面的代码,询问用户的年龄,存储在$age变量中。

如果用户输入的数字小于(-lt)1或不是数字(-nomatch),则提示用户再次输入有效数字。这种行为有助于给用户多次机会输入有效输入。

# 提示用户输入他们的年龄
$age = Read-Host "Please Enter Your Age"

# 设置While循环,直到用户提供有效输入
while($age -notmatch "\\d+" -or $age -lt 1)
{
	# 重新提示用户输入有效的年龄数字
  $age = Read-Host "Please Enter Your Valid Age"
}
# 打印有效的年龄输入
Write-Host "Your age is $age

在下面的输出中,您可以看到用户被提示三次输入他们的年龄,如下所示:

  • 第一次,用户输入了,这不是一个数字。
  • 第二次,用户输入了0,这低于1。
  • 第三次,用户输入了10,这是一个有效的年龄。
Executing a while loop with the OR operator

在 While 循环中使用 BREAK 和 CONTINUE 关键字

您已经看到了 while 循环如何增加您的 PowerShell 脚本的灵活性。但为了更好地控制您的 While 循环的执行,您可以添加 breakcontinue 关键字。

例如,如果您只想处理数组中的某个特定数量的项目,您可以使用 BREAK 关键字在处理完所需数量的项目后退出循环。

这些关键字的功能如下:

Keyword Function
break Immediately exits the loop and continues execution with the rest of the script.
continue Skips over the remaining code block in the current iteration of the loop and continues with the next iteration.

执行下面的代码,它循环遍历一个包含10个项目的数组。

在下面的代码中,if 语句检查 $i 的值。如果 $i 的值是 5continue 关键字将跳过循环中剩余的代码并继续下一次迭代。如果 $i 的值是 8break 关键字将退出循环并继续执行脚本的其余部分。

否则,while 循环将打印(Write-Host)并将 $i 变量的值增加 1

# 声明一个包含10个元素的数组
$array = 1..10
# 声明具有初始值为0的变量 $i
$i = 0
# 设置 While 循环执行直到满足条件
while($i -lt $array.Count)
{
	# 检查 $i 是否等于5
  if($i -eq 5)
  {
		# 如果是,将 $i 增加1
    $i++
		# 继续下一次迭代
    continue
  }
	# 检查 $i 是否等于8
  if($i -eq 8)
  {
		# 如果是,跳出 While 循环并继续执行脚本的其余部分
    break
  }
	# 打印 $i 的当前值
  Write-Host "Processing item $i"
	# 将 $1 增加1
  $i++
}

正如您在下面的输出中所看到的,循环跳过了数组中的第五个和第八个项目。while 循环处理了数组中的所有其他项目,并在达到第八个项目后退出。

Executing a while loop with break and continue keywords

限制 While 循环运行的时间

通常,您可能希望限制循环运行的时间。也许您正在尝试连接到远程服务器。如果是这样,您可以在 while 循环中使用 Start-Sleep cmdlet 给服务器一些时间来响应,然后再超时退出循环。

`Start-Sleep` cmdlet暂停脚本执行一段指定的时间。

执行以下代码以获取并存储当前日期和时间Get-Date$startTime变量中。`while`循环在当前日期/时间小于$startTime中存储的值加10秒时运行。

当`while`循环运行时,一条消息会打印,同时`Start-Sleep` cmdlet暂停脚本执行1秒。

<diy8以下代码块仅是实践中实际使用的模板。根据需要在循环内放更多代码。

# 获取并存储当前日期/时间
$startTime = Get-Date
# 设置 While 循环在当前日期/时间小于 10 秒时运行
	# 从存储在 $startTime 中的值开始。
while((Get-Date) -lt ($startTime.AddSeconds(10)))
{
	# 打印一条消息
  Write-Host "Waiting for server to respond..."
	# 暂停脚本一秒钟
  Start-Sleep -Seconds 1
}

下面,您可以看到循环在退出循环之前运行了 10 秒。

Limiting the time a while loop runs

结论

当面对复杂概念时,PowerShell 的 while 循环非常方便,可以避免陷入循环或在编写脚本时出现问题。在本教程中,您已经学会了许多使用 while 循环编写更灵活、更强大的脚本的方法。

有了这些新知识,您的可能性无限大。那么为什么不最大化使用逻辑运算符和关键字来自动化脚本中的任务呢?

Source:
https://adamtheautomator.com/powershell-while-loop/