9

我正在尝试在 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

4

1 回答 1

8

调用运算符 (&) 始终使用新范围。相反,请使用点源 (.) 运算符:

$ErrorActionPreference = "Stop"

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

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

function after( $sb )
    {
    . $sb
    }

describe

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

于 2012-07-29T14:26:17.847 回答