モジュール (つまり.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
の値が「上書き」されるために発生します。$a1
f1
スクリプトブロックで変数を選択的にキャプチャする方法はありますか? $a1
例から作業して、内部f1
と$a2
内部の両方をキャプチャする方法はありf2
ますか?
参考文献
PowerShell スコープは単純ではありません。この不完全な要因のリストから可能性を検討してください。
- いつでもアクティブなグローバル スコープ階層とモジュール スコープ階層の任意の組み合わせが存在する可能性があります
.
&
呼び出しはスコープに異なる影響を与えます。- パイプラインによって提供される高度なフロー制御は、異なるまたは同じスコープ階層の
begin
、process
、およびスクリプト ブロックの複数のスコープ、または同じ関数の複数の呼び出しを同時にアクティブにできることを意味します。end
言い換えれば、PowerShell スコープの実用的な説明は単純さに反します。
about_Scopesのドキュメントは、問題が実際よりもはるかに単純であることを示唆しています。おそらく、この問題のコードを分析して理解することで、より完全な理解につながるでしょう。