【问题标题】:Access a variable from parent scope从父范围访问变量
【发布时间】:2022-08-16 01:40:22
【问题描述】:

在单模块场景中:运行 Set-Var 返回 10。

# m.psm1

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

function Get-Var {
    $MyVar
}

在嵌套模块场景中:运行 Set-Var 不返回任何值。

# m1.psm1

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

Import-Module .\\m1.psm1

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

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

  • 我想你应该使用函数的参数,否则 $MyVar 只是每个函数内部的一个局部变量($null)

标签: powershell


【解决方案1】:

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

你可以这样做:

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

【讨论】:

  • 对此进行了测试。它从直接父级获取变量。因为,我们也可以访问父级的 PSCmdlet,所以我们可以继续移动到前一个调用者。如果调用者在同一个模块中,有没有办法做同样的事情?我在 Get-Variable -scope 1 中看到了您的另一篇文章。有什么方法可以直接在 C# 中执行此操作而无需调用?
  • @NavaneethP“任何方法可以直接在C#中执行此操作而无需调用”是什么意思。您的意思是用 C# 编写的已编译 cmdlet?
  • 是的。用 C# 编写的编译后的 cmdlet。 GetVariableValue 和 SessionState.PSVariable.GetValue 没有范围参数。
  • @NavaneethP 抱歉,对此无能为力。我从来没有写过编译过的cmdlet。
猜你喜欢
  • 2012-01-13
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 2013-06-12
  • 1970-01-01
相关资源
最近更新 更多