从父范围访问变量
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?
在单模块场景中:运行 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?