流程控制
「流量控制」是指您的程式碼在主控台或指令碼中的執行方式。 其描述程式碼遵循的「流量」,以及您控制流量的方式。 有各種可用的建構可協助您控制流程。 程式碼可以執行所有陳述式或只執行其中一些。 其也可以重複特定的陳述式,直到符合特定條件為止。
讓我們來看看這些流量控制的建構,以瞭解其功能:
清理輸入。 如果您在指令碼中使用參數,您必須確保參數保留合理的值,讓您的指令碼能如預期運作。 寫入程式碼來管理此流程,稱為「清理」輸入。
控制執行流程。 先前的技巧可確保您取得合理且正確的輸入資料。 這技巧決定如何執行程式碼的詳細資訊。 設定的值可以判斷執行的陳述式群組。
逐一查看資料。 有時候您的資料會採用陣列的形式,也就是包含許多項目的資料結構。 針對這類資料,您可能需要檢查每一個項目,並對每個項目執行作業。 PowerShell 中的許多建構都可協助您處理該流程。
注意
反覆運算陣列的範圍超出此課程模組的範圍。 有許多建構可以處理 PowerShell 中的流量控制。 我們無法將其全部命名,但我們會討論您可能會在所讀取或寫入的指令碼中遇到的一些重要的問題。
使用 If
、ElseIf
和 Else
來管理輸入和執行流程
您可以使用 If
建構來判斷運算式是否為 True
或 False
。 根據該判斷,您可能會執行 If
建構所定義的陳述式。 If
的語法如下所示:
If (<expression that evaluates to True or False>)
{
# Statement that runs only if the preceding expression is $True.
}
操作員
PowerShell 有兩個內建參數,可判斷運算式是 True
或 False
:
$True
表示運算式為True
。$False
表示運算式為False
。
您可以使用運算子來判斷運算式是否為 True
或 False
。 有幾個運算子。 基本概念通常是要判斷運算子左邊的某個項目是否與右邊相符 (指定運算子的條件)。 運算子可以表達條件,例如某個項目是否等於其他項目、大於其他項目,或符合正規則運算式。
以下是使用運算子的範例。 -le
運算子會決定如果左邊運算子的值是小於或等於右邊的值:
$Value = 3
If ($Value -le 0)
{
Write-Host "Is negative"
}
此程式碼不會顯示任何值,因為運算式會評估為 False
。 值 3 顯然是正面的。
Else
只有當 If
建構評估為 True
時,才會執行陳述式。 如果您想要處理評估為 False
的案例,該怎麼辦? 這就是當您使用 Else
建構的時候。 If
表示「如果此特定案例為 true,請執行此陳述式。」Else
不採用運算式。 其會擷取 If
子句評估為 False
的所有案例。 當 If
和 Else
結合時,程式碼會在這兩個建構的其中一個執行陳述式。 讓我們修改先前的程式碼,以包含 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
If
和 Else
非常適合用來涵蓋所有程式碼可採用的路徑。 ElseIf
是另一種可能很實用的建構。 ElseIf
就是要與 If
一起使用。 其指出「如果上述 If
陳述式評估為 False
,則會評估此建構中的運算式。」如同 If
,ElseIf
可以採用運算式,因此有助於將 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
,然後再評估 ElseIf
和 Else
。
注意
Else
也是同樣的,如果您未在上面定義 If
,就無法使用 ElseIf
。