次のコードを実行してみてください。
function Hoge
{
$a = 0;
&{
$a = 1;
};
return $a;
}
Hoge;
このコードでは Hoge 関数の中の子スコープで変数 a に 1 を代入しています。
子スコープで変数に値を代入しても親スコープの変数には影響しません。
よって、Hoge 関数の戻り値は 0 です。
では次のコードを実行してみてください。
function Hoge
{
$a = 0;
&{
Set-Variable -Name "a" -Value 1 -Scope 1;
};
return $a;
}
Hoge;
このコードを実行すると 1 が返ってきます。
子スコープから親スコープの変数に値を代入したということです。
Set-Variable コマンドレットでは、設定する変数のスコープを、Scope オプションにて指定することができます。
そして、Scope オプションに数値を指定した場合、現在のスコープからの相対的な位置として解釈します。
つまり、Scope オプションに 1 を指定すると、親スコープの変数を設定できるわけです。
だから何だ?と言われると何とも言えないのですが、マニアックなことやろうとした時、これが思わぬ効果を発揮するかもしれません。
コメント
スコープって重要ですよね。
PowerShellはその辺もよく考えられていて、理解して使用すれば、その効果は絶大ですね。
-Scopeパラメータに1を指定すると親スコープ、0を指定すると現在のスコープ、それ以外にGlobal, Loacl, Scriptも指定できますよね。
よこけんさんの例題はシンプルで理解しやすくていいですね。
見習わなくては