PowerShell For Loop: 一份全面指南

当您使用 PowerShell 脚本来管理系统或处理大量任务时,无疑会遇到在脚本中使用循环结构的需要。PowerShell 中有许多类型的循环,其中之一是 \texttt{for} 循环。

PowerShell 的 \texttt{for} 循环可以快速地在多个项目上运行相同的命令,并产生一致的结果。

在本文中,您将了解 PowerShell 中的 \texttt{for} 循环是什么,理解其语法以及构成 \texttt{for} 循环语句的各部分。您还将从示例中了解一些使用 \texttt{for} 循环的不同方式。

理解 PowerShell for 循环语句和占位符PowerShell 中的 \texttt{for} 循环通常在命令或进程需要运行的次数(迭代次数)已知的情况下使用。例如,当您希望仅处理数组中的一部分值时(例如,仅处理 X 项中的前 10 项)。

使用 \texttt{for} 循环可以更好地控制代码何时退出的限制和条件,与 \texttt{foreach} 循环或 \texttt{ForEach-Object} cmdlet 相比,在这些情况下,迭代在处理集合中的最后一项之后停止。

以下是 \texttt{for} 循环语句的语法,供您参考。

for (<Initial iterator value>; <Condition>; <Code to repeat>)
{
    <Statement list>
}

正如您在上面的语法中所看到的,PowerShell 的 \texttt{for} 循环语句可以分解为四个必须了解的占位符。这些占位符分别是 \diy12{Initial}、\diy13{Condition}、\diy14{Repeat} 和 \diy15{Statement list}。

  • 初始 占位符是您指定起始值的地方。这个值只在语句中读取一次。通常,脚本编写者将这个变量赋值为零。
  • 条件 占位符指定了确定循环是否应继续运行或结束的限制或条件。在这个占位符中使用的表达式求值为 true。
  • 重复 占位符接受多个命令。在每次循环重复之后以及重新评估 条件 之前,将执行此占位符中提供的命令。脚本编写者通常使用这个占位符来提供一个表达式,以增加或减少 初始 占位符中的值。
  • 最后,语句列表 占位符是您打算运行的主要代码的位置。此占位符中的代码在循环中重复,直到 条件 返回 $False 的值。

理解 PowerShell For 循环执行流程

为了进一步理解 PowerShell for 循环的工作原理,您需要熟悉它的执行流程。for 循环最初是一个四步过程,然后在初始运行后变成一个三步过程。要进一步解释,请继续阅读下面的算法。

第一步

在 for 循环语句的开始,读取并将 初始 值存储到内存中。

示例:$num = 0

第二步

for循环语句评估条件占位符内表达式的布尔结果。如果结果为$false,则for循环将终止。如果结果为$true,则for循环将继续执行下一步。

示例:$num -lt 10

步骤 3

PowerShell运行语句列表占位符内的代码。可能包含一个或多个命令、脚本块或函数。

示例:"我数 $num "

步骤 4

在此步骤中,运行重复占位符内的表达式,这将更新初始占位符的当前值。然后,流程将返回到步骤 2。

示例:$num++

使用PowerShell For循环(示例)

接下来的部分将是如何以各种方式使用for循环的一些示例。这些示例可能或可能没有实际或现实生活中的用途。但您将学到的技术可以指导您在遇到真正需要时如何使用for循环。

现在您已经了解了for循环的工作原理,是时候看看如何使用基本代码将其全部组合起来了。

获取一系列数字

下面的代码在控制台上重复显示字符串"我数 $num",从1开始,直到$num的值达到10。

for ($num = 1 ; $num -le 10 ; $num++){    "I count $num"}

当您复制上述代码并将其粘贴到您的PowerShell会话中以运行时,下面的屏幕截图显示了结果。

For loop example to display numbers less than 10

连接字符串

for循环语句不仅限于数学表达式,如加法、减法或乘法。它还可以用于连接字符串值。

下面的示例将重复字母”x”,每一行的字符数比前一行多一个,直到行中的字符数达到30。

正如您所看到的,$x的值以''初始化,其中不包含任何字符。根据条件的限制,字符数达到$x值中的30时,循环结束。在每次迭代后,一个额外的字母”x”被附加到$x的值中。

for ($x='' ;$x.length -le 30;$x=$x+'x'){
    Write-Host $x
    Start-Sleep -Milliseconds 20
}

下面的输出显示了在PowerShell中运行上述代码时的预期结果。

String concatenation example using For Loop

使用多个初始和重复表达式连接字符串

for循环语句中的InitialRepeat占位符可以接受多个表达式。

使用上面的先前示例中的代码,可以修改代码以在Repeat占位符中添加一个新表达式,以选择一个随机颜色。然后,将随机颜色用作在控制台中显示的字符串的前景色。

如您在第一行中所见,定义了一个包含颜色名称的数组。for循环操作将从该数组中随机选择一个颜色名称。

请注意,InitialRepeat占位符现在具有两个表达式。每个表达式都用括号括起来,并用逗号分隔。

$colors = @("Green","Cyan","Red","Magenta","Yellow","White")
for (($x=''),($fgcolor = $colors | Get-Random) ;$x.length -le 30;($x=$x+'x'),($fgcolor = $colors | Get-Random)){
    Write-Host $x -ForegroundColor $fgcolor
    Start-Sleep -Milliseconds 20
}

一旦在 PowerShell 中运行修改后的代码,预期结果如下所示。

String concatenation example using For Loop

显示进度

循环显示进度指示符可能是 for 循环最常见的用法。这主要用于运行可能需要一些时间才能完成的大量任务。例如,在 Exchange 组织中创建所有邮箱大小的报告,或更新 Active Directory 中多个用户的属性。

下面的示例代码显示了从 1 到 100% 显示进度的基本方法。如你所见,$counter 的初始值为 1,并且条件指示该循环将持续运行,直到 $counter 值达到 100。

for ($counter = 1; $counter -le 100; $counter++ )
{
		# 在此处添加您的代码
    Write-Progress -Activity "Update Progress" -Status "$counter% Complete:" -PercentComplete $counter;
}

在 PowerShell 中运行上述代码时,你应该会看到类似下面的输出。

Progress counter driven by for loop

显示倒计时计时器

下面的代码展示了如何使用 for 循环显示倒计时计时器。这个倒计时计时器只显示剩余的秒数,从 10 开始。

如果你想要更改起始数字,只需要更改 Initial 占位符中 $seconds 变量的值。

for ($seconds=10; $seconds -gt -1; $seconds--) {
    Write-Host -NoNewLine ("`rseconds remaining: " + ("{0:d4}" -f $seconds))
    Start-Sleep -Seconds 1
}

在 PowerShell 中运行上述代码将产生如下示例输出。

A countdown timer that is driven by for loop

显示倒计时计时器(嵌套 For 循环)

如果您想以分钟:秒的格式显示倒计时计时器怎么办?嵌套的for循环可以用来实现这个目的。嵌套的for循环简单地定义为一个for循环在另一个for循环内部,依此类推。

下面的示例代码包含两个for循环语句。

第一个for循环处理计时器的分钟部分的倒计时。正如您所见,在for循环之前有一个$minutes变量,您需要在其中指定for循环将从多少分钟开始倒计时。

第二个for循环处理计时器的部分的倒计时。每次迭代之后,循环会暂停1秒钟然后继续。直到$seconds的值达到0为止,它将继续执行。

# 设置要倒计时的分钟数
$minutes = 1

for ($minutes--; $minutes -gt -1; $minutes--)
{
    for ($seconds = 59 ; $seconds -gt -1 ; $seconds--)
    {
        $remaining = ("{0}:{1}" -f ("{0:d4}" -f $minutes),("{0:d2}" -f $seconds))
        Write-Host "`r$remaining" -NoNewline
        Start-Sleep -Seconds 1
    }
}

当运行以上代码时,下面是倒计时计时器的显示效果。

A Countdown timer using nested for loop

确定质数

PowerShell的for循环也是数学运算的一个很好选择。在这个例子中,for循环用于确定给定数字是否为质数。

A prime number is a number that is only divisible by 1 and N, where N is the number itself. For example, if the value of N is 7, then N divided by 1 is 7 divided by 1.

下面的脚本在执行时将执行以下操作:

  • 提示用户输入一个数字。
  • 使用输入的数字作为被除数进行除法运算,除数是从2到输入数字减1的数字。这意味着如果输入值为7,则除数依次为2、3、4、5和6。
  • 如果商是一个整数,这意味着输入的数字不是质数,然后for循环将被终止。
  • 如果商不是一个整数,这意味着输入的数字是质数。

将此脚本复制并保存为isPrime.ps1

$num = Read-Host "Input a number"

$isPrime = $true
for ($y = 2 ; $y -lt $num ; $y++ )
{
    if (($num / $y) -is [int]) {
        Write-Host "$num is not a prime number"
        $isPrime = $false
        break
    }
}

if ($isPrime -eq $true) {
    Write-Host "$num is a prime number"
}

保存isPrime.ps1脚本后,可以在PowerShell中运行以进行测试。请参阅下面的示例输出。

Using for loop in a script to determine a prime number

摘要

与其他语言中使用的for循环函数相比,PowerShell的for循环没有什么意外之处——这使得它更容易适应,如果您对这个概念不是很陌生的话。

在本文中,您已经学习了PowerShell for循环语句的基础知识。您已经了解了它的语法、逻辑、流程,甚至从几个例子中学习了如何将其用于不同的目的。

请记住,即使PowerShell中有其他类型的循环,说一个比另一个更好是不公平的。这完全取决于代码的目的和编写代码的人的偏好。

利用您从本文中获得的知识,您应该能够找到更多使用for循环自动执行您通常烦人的任务的方法。

进一步阅读

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