親スコープの変数を設定

次のコードを実行してみてください。

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 を指定すると、親スコープの変数を設定できるわけです。

だから何だ?と言われると何とも言えないのですが、マニアックなことやろうとした時、これが思わぬ効果を発揮するかもしれません。

コメント

  1. HIRO より:

    スコープって重要ですよね。
    PowerShellはその辺もよく考えられていて、理解して使用すれば、その効果は絶大ですね。

    -Scopeパラメータに1を指定すると親スコープ、0を指定すると現在のスコープ、それ以外にGlobal, Loacl, Scriptも指定できますよね。

    よこけんさんの例題はシンプルで理解しやすくていいですね。
    見習わなくては

タイトルとURLをコピーしました