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で興味深い例を見つけました(回避策を参照)。それが何らかの形で私を助けるなら。

ティア

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 に答える