1

モジュール (つまり.psm1ファイル)で 2 つの関数を定義したとします。

function f1{
    param($x1)
    $a1 = 10
    f2 $x1
}

function f2{
    param($x2)
    $a2 = 100
    & $x2
}

ここで、次を実行するとします。

PS C:\> $a0 = 1
PS C:\> $x0 = {$a0+$a1+$a2}
PS C:\> f1 $x0
1

$x2内部で呼び出されたにもかかわらず、コマンド ラインのコンテキストを保持します$f2&に変更した場合も同様です.

モジュール内で に置き換え$xn$xn.GetNewClosure()から呼び出すとf1、 の値はキャプチャされますが、 はキャプチャされ100ません10

PS C:\> f1 $x0
101
PS C:\> f1 $x0.GetNewClosure
101

これは、.GetNewClosure()insideを呼び出すと、キャプチャされた inf2の値が「上書き」されるために発生します。$a1f1

スクリプトブロックで変数を選択的にキャプチャする方法はありますか? $a1例から作業して、内部f1$a2内部の両方をキャプチャする方法はありf2ますか?


参考文献

PowerShell スコープは単純ではありません。この不完全な要因のリストから可能性を検討してください。

  • いつでもアクティブなグローバル スコープ階層とモジュール スコープ階層の任意の組み合わせが存在する可能性があります
  • .&呼び出しはスコープに異なる影響を与えます。
  • パイプラインによって提供される高度なフロー制御は、異なるまたは同じスコープ階層のbeginprocess、およびスクリプト ブロックの複数のスコープ、または同じ関数の複数の呼び出しを同時にアクティブにできることを意味します。end

言い換えれば、PowerShell スコープの実用的な説明は単純さに反します。

about_Scopesのドキュメントは、問題が実際よりもはるかに単純であることを示唆しています。おそらく、この問題のコードを分析して理解することで、より完全な理解につながるでしょう。

4

1 に答える 1