2012-04-10 19 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

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を参照してください。

関連する問題