在 Windows PowerShell 指令碼中使用變數範圍
直覺上,您會假設可以在函式完成時,在指令碼中存取您於函式中設定且名為 $computer 的變數。 不過,事實並非如此。 變數具有特定範圍,而且在範圍之間互動的方式有所限制。
下表描述三個範圍,以及這些範圍如何影響變數使用方式。
表 1:範圍
| 範圍 | 描述 |
|---|---|
| 全球 | 全域範圍適用於 Windows PowerShell 提示。 Windows PowerShell 提示字元所設定的變數,可以在該 Windows PowerShell 提示字元開始的所有指令碼中檢閱。 在其他 Windows PowerShell 提示或 Windows PowerShell 整合式指令碼環境的執行個體中,Windows PowerShell 提示所建立的變數不存在 (ISE)。 |
| 指令碼 | 指令碼範圍適用於單一指令碼。 指令碼內設定的變數可由該指令碼內的所有函式檢閱。 如果您在已存在於全域範圍的指令碼範圍中設定變數值,則會在指令碼範圍中建立新的變數。 然後在兩個不同的範圍中,有兩個相同名稱的變數。 此時,當您檢閱指令碼中的變數值時,會傳回指令碼範圍中的變數值。 |
| 函式 | 函式範圍適用於單一函式。 在函式內設定的變數不會與其他函式或指令碼共用。 如果您在已存在於全域或指令碼範圍的函式範圍中設定變數值,則會在函式範圍中建立新的變數。 然後在兩個不同的範圍中,有兩個相同名稱的變數。 |
注意
為了避免混淆,最佳做法是避免在不同範圍中使用相同的變數名稱。
除了檢閱較高層級範圍的變數之外,您也可以在修改變數時特別參考變數範圍來修改該變數。 若要從函式修改指令碼範圍變數,請使用下列語法:
$script:var = "Modified from function"
最佳做法是避免在範圍之間修改變數,因為這麼做可能會導致混淆。 相反地,請將指令碼範圍變數設定為等於函式的輸出。 如果函式中的數據位於變數中,您可以使用 Return() 將它傳回腳本。
以下是在函式結尾使用 Return() 將變數值傳回腳本範圍的範例:
Return($users)
注意
在函式中使用 Return() 會將指定的數據新增至所傳回的數據管線,但不會取代管線中的現有數據。 在指令碼開發過程中,您必須確認函式所傳回的資料確切。