PowerShell - 在特定范围内执行脚本块

时间:2012-07-29 07:45:03

标签: powershell scope

我正在尝试在Powershell中实现像BDD框架一样的RSpec / Jasmine(或至少研究制作一个的潜在问题)。

目前我在实现简单的前/后功能方面存在问题。给定

$ErrorActionPreference = "Stop"

function describe()
    {
    $aaaa = 0;
    before { $aaaa = 2; };
    after { $aaaa; }
    }

function before( [scriptblock]$sb )
    {
    & $sb
    }

function after( $sb )
    {
    & $sb
    }

describe

输出是0,但我希望它是2.有没有办法在Powershell中实现它(没有让$ aaaa全局,在脚本块中遍历父范围直到$ aaaa被发现,使$ aaaa成为“对象”和其他肮脏的黑客:))

我理想的是一种在其他范围内调用脚本块的方法,但我不知道它是否可行。我在https://connect.microsoft.com/PowerShell/feedback/details/560504/scriptblock-gets-incorrect-parent-scope-in-module找到了一个有趣的例子(参见解决方法),但我不确定它是如何工作的,以及它是否对我有任何帮助。

TIA

1 个答案:

答案 0 :(得分:8)

呼叫运营商(&)始终使用新范围。而是使用点源(。)运算符:

$ErrorActionPreference = "Stop"

function describe()
    {
    $aaaa = 0;
    . before { $aaaa = 2; };
    . after { $aaaa; }
    }

function before( [scriptblock]$sb )
    {
    . $sb
    }

function after( $sb )
    {
    . $sb
    }

describe

注意使用. function在与定义`$ aaaa相同的范围内调用函数。