7

Test.psm1という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

この時点で「新しい値」を返したいのですが、「デフォルト値」を返しています。その変数のスコープを設定する方法を見つけようとしましたが、うまくいきませんでした。

4

2 に答える 2

12

ジェイミーは正しいです。あなたの例では、最初の行で、$property = 'Default Value'はファイルスコープの変数を示しています。関数ではSet-Property、割り当てるときに、関数の外部に表示されないローカルスコープの変数に割り当てます。最後に、では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

ジェイミーの例によると、それは機能します。ただし、デフォルトではスクリプトスコープにあるため、最初の行でスコープ修飾子を使用する必要はないことに注意してください。また、親スコープ変数がデフォルトで返されるため、Get-Propertyでスコープ修飾子を使用する必要はありません。

于 2012-04-10T22:18:23.467 に答える
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を参照してください。

于 2012-04-10T21:59:43.580 に答える