ja-JP/about_Scopes.help.txt

TOPIC
    about_Scopes

簡単な説明
    PowerShell における「スコープ」の概念と、変数・エイリアス・関数・
    PowerShell ドライブのスコープを制御する方法を説明します。

詳細な説明
    PowerShell は、変数・エイリアス・関数・PowerShell ドライブ (PSDrive)
    へのアクセスをスコープによって管理します。スコープは、別のスコープの
    項目を意図せず変更してしまうことを防ぐ仕組みです。

スコープの基本ルール

    - スコープは入れ子 (ネスト) になります。外側のスコープを「親スコープ」、
      内側のスコープを「子スコープ」と呼びます。

    - 項目は、作成されたスコープと、その子スコープから参照できます。ただし
      明示的にプライベートとして作成した場合は、そのスコープ内でのみ
      参照できます。

    - 項目は、作成されたスコープ内でのみ変更できます。別のスコープの項目を
      変更するには、スコープ修飾子を明示的に指定する必要があります。

    - 項目を参照すると、PowerShell は現在のスコープから親スコープへと
      順にさかのぼって検索します。見つかった最初の項目が使われます。
      子スコープで親と同じ名前の項目を作成すると、親の項目は変更されず、
      子スコープ内ではコピー (シャドウ) された項目が使われます。

名前付きスコープ

    PowerShell には、次の名前付きスコープがあります。

    - Global (グローバル)
      PowerShell の起動時に作成されるルートのスコープです。自動変数や
      基本設定変数、プロファイルで定義した変数・関数などが含まれます。

    - Local (ローカル)
      現在のスコープです。グローバルスコープのこともあれば、それ以外の
      任意のスコープのこともあります。

    - Script (スクリプト)
      スクリプトファイルが実行されると作成されるスコープです。スクリプト
      内のコマンドにとってのローカルスコープとして機能します。

番号付きスコープ

    スコープは数値でも参照できます。0 が現在のスコープ、1 が親スコープ、
    2 がその親 (祖父母) のスコープ、というように、相対位置で指定します。

        $test = "Global"
        function MyFunc {
            $test = "Local"
            Get-Variable -Name test -Scope 0 # Local
            Get-Variable -Name test -Scope 1 # Global
        }

スコープ修飾子

    変数名や関数名の前にスコープ修飾子を付けると、対象のスコープを指定
    できます。

    - Global: グローバルスコープを参照します。
    - Local: 現在のスコープを参照します (親は検索しません)。
    - Private: その項目を作成したスコープ内でのみ参照可能にします。
    - Script: 最も近い祖先のスクリプトスコープ、なければグローバル
                 スコープを参照します。
    - Using: リモート/バックグラウンド操作などで、呼び出し元スコープの
                 変数を参照します。

        $Global:count = 0
        $Script:config = "default"
        $Private:secret = "xxx"

    Alias:, Env:, Function:, Variable: は名前空間を指定する修飾子です。

Using: スコープ修飾子

    Using: 修飾子は PowerShell 3.0 で導入され、リモートコマンド・
    バックグラウンドジョブ・スレッドジョブの中で、ローカルセッションの
    変数を参照できるようにします。

        $msg = "Hello"
        Invoke-Command -ComputerName Server01 -ScriptBlock {
            "$Using:msg from remote"
        }

    リモートおよびプロセス外のセッションでは、埋め込まれた変数の値は
    常に呼び出し元のデータの独立したコピーになります。

AllScope オプション

    変数とエイリアスには AllScope プロパティを設定できます。AllScope を
    持つ項目は、作成後に作られる子スコープへ自動的に引き継がれます。
    また、どのスコープからでも変更が可能です。

スコープではない関連概念

    - セッション: 独立したグローバルスコープを持つ、自己完結した環境です。

    - モジュール: 独自のスコープ階層を持ちます。エクスポートされた項目は
      呼び出し元から参照でき、エクスポートされていない項目は非公開のまま
      です。

    - 入れ子のプロンプト: 新しいスコープは作成されず、ローカルスコープの
      ままです。

    - Private オプション / Visibility プロパティ: 新しいスコープを作らずに、
      項目の参照可能範囲を制限します。



    次の例は、子スコープが親の変数をシャドウする様子を示します。

        $a = 1
        function Test {
            $a = 2 # ローカルにコピーが作られる
            "関数内: $a" # 2
        }
        Test
        "関数外: $a" # 1 (親は変更されない)

    親スコープの変数を関数内から変更したい場合は、Script: または Global:
    修飾子を使います。

        $a = 1
        function Test {
            $Script:a = 2
        }
        Test
        $a # 2

関連項目
    about_Variables
    about_Functions
    about_Script_Blocks
    about_Remote_Variables
    about_Environment_Variables

----
原文: PowerShell-Docs (CC BY 4.0) の翻訳 / PSHelpJaJP