2012-04-10 64 views
4

我有一個名爲Test.psm1的PowerShell模塊。我想爲變量設置一個值,並且在我調用該模塊中的另一個方法時可以訪問它。在PowerShell模塊中設置屬性

#Test.psm1 
$property = 'Default Value' 

function Set-Property([string]$Value) 
{ 
    $property = $Value 
} 

function Get-Property 
{ 
    Write-Host $property 
} 

Export-ModuleMember -Function Set-Property 
Export-ModuleMember -Function Get-Property 

從PS命令行:

Import-Module Test 
Set-Property "New Value" 
Get-Property 

在這一點上我想它返回「新價值」,但它的返回「默認值」。我試圖找到一種方法來設置該變量的範圍,但沒有任何運氣。

回答

9

Jamey是正確的。在您的示例中,在第一行中,$property = 'Default Value'表示文件範圍變量。在Set-Property函數中,當您分配時,您將分配給在函數外部不可見的localy範圍變量。最後,在Get-Property中,由於沒有具有相同名稱的本地範圍變量,因此讀取了父範圍變量。如果你改變你的模塊

#Test.psm1 
$property = 'Default Value' 

function Set-Property([string]$Value) 
{ 
     $script:property = $Value 
} 

function Get-Property 
{ 
     Write-Host $property 
} 

Export-ModuleMember -Function Set-Property 
Export-ModuleMember -Function Get-Property 

根據Jamey的例子,它會工作。但請注意,您不必在第一行中使用範圍限定符,因爲您在默認情況下處於腳本範圍內。此外,您不必在Get-Property中使用範圍限定符,因爲默認情況下會返回父範圍變量。

+1

+1模塊有其自己的範圍,可以將模塊與來自呼叫者環境的意外污染隔離開來。 – JPBlanc 2012-04-11 04:12:54

3

你在正確的軌道上。訪問$ property時,您需要強制模塊中的方法使用相同的範圍。

$script:property = 'Default Value' 
function Set-Property([string]$Value) { $script:property = $value; } 
function Get-Property { Write-Host $script:property } 
Export-ModuleMember -Function * 

請參閱about_Scopes瞭解更多信息。