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 的值列印到控制台中。

# 將 $i 變數聲明為初始值為 0
$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不等於(-ne3$i不等於(-ne5時,循環while

當兩個變數的值同時滿足各自的條件時,循環中斷,執行繼續進行腳本的其餘部分。

# 声明 $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

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

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

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

您已经看到了如何使您的PowerShell脚本更加灵活。但是为了更好地控制While循环的执行,可以添加break和continue关键字。

例如,如果您只想处理数组中的一定数量的项,可以使用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的值为5,则continue关键字跳过循环中剩余的代码,继续下一次迭代。如果$i的值为8,则break关键字退出循环,并继续执行脚本的其余部分。

否则,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 暫停腳本的執行一秒時,會列印一條訊息。

以下程式碼區塊僅是實際應用中會使用的範本。您可以根據需要在迴圈內放入更多程式碼。

# 獲取並存儲當前日期/時間
$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/