首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PowerShell ScriptBlock变量作用域

PowerShell ScriptBlock变量作用域
EN

Stack Overflow用户
提问于 2017-02-03 18:34:04
回答 1查看 2.1K关注 0票数 8

我在理解ScriptBlock中的作用域时遇到了问题,我指望着某种类似闭包的系统,但我似乎不能让它工作。

我有一个接受param并返回另一个ScriptBlockScriptBlock

代码语言:javascript
复制
$sb1 = {
    Param($Message1);
    Write-Host $Message1;
    {
        Param($Message2);
        Write-Host ($Message1 + " " + $Message2);
    }
}

为了获得内部ScriptBlock,我可以用$sb2 = & $sb1 -Message1 "Message1"调用$sb1。这与Message1相呼应,因此我们知道param是绑定的。

现在我可以用& $sb2 -Message2 "Message2"调用$sb2了。我原本希望使用Message1 Message2,但它只是写成了Message2

有什么方法可以访问$Message1变量吗?我不能使用局部变量或脚本变量,因为会有多个内部scriptblock实例具有不同的$Message1

这是实际shell的实际输出:

代码语言:javascript
复制
PS C:\> $h1 = { Param($Message1); Write-Host $Message1; { Param($Message2); Write-Host ($Message1 + " " + $Message2); } }
PS C:\> $h2 = & $h1 -Message1 "Message1"
Message1
PS C:\> $h2
 Param($Message2); Write-Host ($Message1 + " " + $Message2);
PS C:\> & $h2 -Message2 "Message2"
 Message2
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-03 18:50:47

您需要显式地create a closure

代码语言:javascript
复制
$sb1 = {
    Param($Message1);
    Write-Host $Message1;
    {
        Param($Message2);
        Write-Host ($Message1 + " " + $Message2);
    }.GetNewClosure()
}

然后它对我起作用:

代码语言:javascript
复制
PS> $2 = & $sb1 One
One
PS> & $2 Two
One Two
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42022194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档