【问题标题】:PowerShell - execute script block in specific scopePowerShell - 在特定范围内执行脚本块
【发布时间】:2012-07-29 07:45:02
【问题描述】:

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

目前我在实现简单的前后功能时遇到问题。给定

$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

【问题讨论】:

  • 你看过 Pester 吗:github.com/scottmuc/pester
  • 是的,它不像RSpec/Jasmine,可能是因为上面描述的问题。我在 Pester 方面的经验非常有限,但恕我直言,Pester 是一个非常有限的框架,没有后/前、没有嵌套描述、损坏的匹配器实现等。
  • 然后考虑贡献:)
  • 我肯定会考虑做出贡献,目前我只是在评估在 PowerShell 中实现更好版本的可能性——这可能是不可能的,而 Pester 就是这样,因为在考虑之后做出了有意识的设计决策PowerShell 限制。
  • 我对 PowerShell 的 BDD 框架的看法:github.com/mbergal/Jester。注意:正在进行中

标签: powershell scope


【解决方案1】:

调用运算符 (&) 始终使用新范围。而是使用点源 (.) 运算符:

$ErrorActionPreference = "Stop"

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

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

function after( $sb )
    {
    . $sb
    }

describe

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    相关资源
    最近更新 更多