流程控制

已完成

「流量控制」是指您的程式碼在主控台或指令碼中的執行方式。 其描述程式碼遵循的「流量」,以及您控制流量的方式。 有各種可用的建構可協助您控制流程。 程式碼可以執行所有陳述式或只執行其中一些。 其也可以重複特定的陳述式,直到符合特定條件為止。

讓我們來看看這些流量控制的建構,以瞭解其功能:

  • 清理輸入。 如果您在指令碼中使用參數,您必須確保參數保留合理的值,讓您的指令碼能如預期運作。 寫入程式碼來管理此流程,稱為「清理」輸入。

  • 控制執行流程。 先前的技巧可確保您取得合理且正確的輸入資料。 這技巧決定如何執行程式碼的詳細資訊。 設定的值可以判斷執行的陳述式群組。

  • 逐一查看資料。 有時候您的資料會採用陣列的形式,也就是包含許多項目的資料結構。 針對這類資料,您可能需要檢查每一個項目,並對每個項目執行作業。 PowerShell 中的許多建構都可協助您處理該流程。

    注意

    反覆運算陣列的範圍超出此課程模組的範圍。 有許多建構可以處理 PowerShell 中的流量控制。 我們無法將其全部命名,但我們會討論您可能會在所讀取或寫入的指令碼中遇到的一些重要的問題。

使用 IfElseIfElse來管理輸入和執行流程

您可以使用 If 建構來判斷運算式是否為 TrueFalse。 根據該判斷,您可能會執行 If 建構所定義的陳述式。 If 的語法如下所示:

If (<expression that evaluates to True or False>) 
{
  # Statement that runs only if the preceding expression is $True.
}

操作員

PowerShell 有兩個內建參數,可判斷運算式是 TrueFalse

  • $True 表示運算式為 True
  • $False 表示運算式為 False

您可以使用運算子來判斷運算式是否為 TrueFalse。 有幾個運算子。 基本概念通常是要判斷運算子左邊的某個項目是否與右邊相符 (指定運算子的條件)。 運算子可以表達條件,例如某個項目是否等於其他項目、大於其他項目,或符合正規則運算式。

以下是使用運算子的範例。 -le 運算子會決定如果左邊運算子的值是小於或等於右邊的值:

$Value = 3
If ($Value -le 0) 
{
  Write-Host "Is negative"
}

此程式碼不會顯示任何值,因為運算式會評估為 False。 值 3 顯然是正面的。

Else

只有當 If 建構評估為 True 時,才會執行陳述式。 如果您想要處理評估為 False 的案例,該怎麼辦? 這就是當您使用 Else 建構的時候。 If 表示「如果此特定案例為 true,請執行此陳述式。」Else 不採用運算式。 其會擷取 If 子句評估為 False 的所有案例。 當 IfElse 結合時,程式碼會在這兩個建構的其中一個執行陳述式。 讓我們修改先前的程式碼,以包含 Else 建構:

$Value = 3
If ($Value -le 0) 
{
  Write-Host "Is negative"
} Else {
  Write-Host "Is Positive"
}

由於我們將 Else 放在 If 的結束大括弧旁,因此我們建立了一個聯結的建構,可作為一個整體來使用。 如果您在主控台中執行此程式碼,您會看到 Is Positive 的列印。 這是因為 If 會評估為 False,但 Else 會評估為 True。 因此,Else 列印其陳述式。

注意

只有在其上方定義 If 建構時,才能使用 Else

ElseIf

IfElse 非常適合用來涵蓋所有程式碼可採用的路徑。 ElseIf 是另一種可能很實用的建構。 ElseIf 就是要與 If 一起使用。 其指出「如果上述 If 陳述式評估為 False,則會評估此建構中的運算式。」如同 IfElseIf 可以採用運算式,因此有助於將 ElseIf 視為次要 If

以下是使用 ElseIf 的範例:

# _FullyTax.ps1_
# Possible values: 'Minor', 'Adult', 'Senior Citizen'
$Status = 'Minor'
If ($Status -eq 'Minor') 
{
  Write-Host $False
} ElseIf ($Status -eq 'Adult') {
  Write-Host $True
} Else {
  Write-Host $False
}

您可以使用更精簡的方式來寫入此程式碼,但這種方式確實示範了 ElseIf 的使用方式。 其會顯示如何先評估 If,然後再評估 ElseIfElse

注意

Else 也是同樣的,如果您未在上面定義 If,就無法使用 ElseIf