在 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() 會將指定的數據新增至所傳回的數據管線,但不會取代管線中的現有數據。 在指令碼開發過程中,您必須確認函式所傳回的資料確切。