PowerShell For Loop:全面指南

當您使用PowerShell腳本來管理系統或處理批量任務時,您無疑會遇到需要使用循環結構的需求作為腳本的一部分。PowerShell中有許多類型的循環可用,其中之一是for循環。PowerShell的for循環可以快速在多個項目上運行相同的一組命令,並產生一致的結果。

在本文中,您將學習PowerShell中的for循環是什麼,了解其語法以及組成for循環語句的要素。您還將從示例中學習使用for循環的不同方法。

了解PowerShell的for循環語句和佔位符

通常在已知命令或過程需要運行的次數(迭代次數)時,使用PowerShell的for循環。例如,當您只想處理數組中的一個子集(例如,只處理X個項目中的10個)時。

使用for循環可以更好地控制在何時退出代碼的限制和條件。這與foreach循環ForEach-Object命令不同,在遍歷完集合中的最後一個項目後停止迭代。

以下是for循環語句的語法供您參考。

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

如上面的語法所示,PowerShell的for循環語句可以分解為四個必須知道的佔位符。這些佔位符是InitialConditionRepeatStatement list佔位符。

  • 初始佔位符是您指定起始值的地方。此值只會被語句讀取一次。通常,腳本編寫者會將此變量賦值為零。
  • 條件佔位符指定了限制或條件,以確定循環是否應繼續運行或結束。在此佔位符中使用的表達式將求值為true。
  • 重複佔位符接受多個命令。在每次循環重複之後,並在重新評估條件之前,將執行此佔位符中提供的命令。腳本編寫者通常使用此功能來提供一個表達式,以增加或減少初始佔位符中的值。
  • 最後,語句列表佔位符是您要放置主要代碼的地方。在此佔位符內部的代碼將在循環中重複執行,直到條件返回$False值為止。

理解 PowerShell For 循環的執行流程

要進一步理解 PowerShell for 循環的工作原理,您需要熟悉其執行流程。for 循環最初是一個四步流程,然後在初始運行後變為三步流程。為了進一步解釋,請繼續閱讀下面的算法。

步驟 1

在 for 循環語句的開始處,將讀取並將初始值存儲到內存中。

示例:$num = 0

步驟 2

for循環語句評估Condition占位符內的表達式的布爾結果。如果結果為$false,則終止for循環。如果結果為$true,則for循環繼續到下一步。

例子:$num -lt 10

第3步

PowerShell運行Statement list占位符內的代碼。這可以是一個或多個命令、腳本塊或函數。

例子:"我數 $num "

第4步

在此步驟中,運行Repeat占位符內的表達式,將更新Initial占位符的當前值。然後,流程將返回到第2步。

例子:$num++

使用PowerShell For循環(示例)

下一節將介紹如何以各種方式使用for循環的一些示例。這些示例可能或可能沒有實際或實際使用價值。但是,您將學到的技巧可以指導您在真正需要使用for循環時如何使用。

現在,您已經了解了for循環的工作原理,現在是時候看看如何使用基本代碼將其結合在一起了。

獲取一系列數字

下面的代碼從1開始,重復在控制台上顯示字符串"我數 $num",直到$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迴圈操作將從此陣列中隨機選擇一個顏色名稱。

請注意,Initial和Repeat佔位符現在有兩個表達式。每個表達式都被括在括號中,並以逗號分隔。

$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开始。

如果您想更改起始数字,只需要更改初始占位符中$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/