从父范围访问变量

Access a variable from parent scope

在单模块场景中:运行 Set-Var returns 10.

# m.psm1

function Set-Var {
    $MyVar = 10
    Get-Var
}

function Get-Var {
    $MyVar
}

在嵌套模块场景中:运行 Set-Var 没有 return 任何值。

# m1.psm1

function Get-Var {
    $MyVar
}
# m.psm1

Import-Module .\m1.psm1

function Set-Var {
    $MyVar = 10
    Get-Var
}

如何实现与嵌套模块的单个模块相同的效果?使用 $script:MyVar 也不起作用。但是,我想将变量的范围保留在本地,以启用不同值的并发执行。

您的代码不起作用,因为嵌套模块上下文中的函数不继承局部变量。

您可以这样做:

function Get-Var {
    [CmdletBinding()] param()
    $PSCmdlet.SessionState.PSVariable.Get('MyVar').Value
}
  • 使用 CmdletBinding 属性创建 advanced function。这是使用自动 $PSCmdlet 变量的先决条件,我们在下一步中需要它。
  • 使用其 SessionState.PSVariable 成员从父(模块)范围获取或设置变量。
  • 请注意,这仅在调用者位于 不同模块或脚本 中时有效。
  • This answer 显示了如何在父(模块)范围内设置 变量的示例。
  • 另请参阅:Is there any way for a powershell module to get at its caller's scope?