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

根据 Jamey 的示例,它会起作用。请注意,您不必在第一行使用范围限定符,因为默认情况下您处于脚本范围内。此外,您不必在 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 回答