トピック
    about_Scopes

簡易説明
    Windows PowerShell のスコープの概念と、要素のスコープを設定および変更する方法について説明し
    ます。

    
詳細説明
    Windows PowerShell は、変数、エイリアス、関数、および Windows PowerShell ドライブ 
    (PSDrives) の読み取りや変更が可能な場所を制限することで、これらの要素へのアクセスを保護します。
    スコープに対していくつかの簡単な規則を適用することで、変更してはいけない項目を誤って変更する
    ことを防止できます。


    スコープの基本規則を次に示します。

        - スコープ内に作成された項目は、明示的にプライベートとして宣言した場合を除き、項目が作
          成されたスコープ内およびその子スコープ内でのみ可視になります。変数、エイリアス、関数、
          または Windows PowerShell ドライブを 1 つまたは複数のスコープに定義できます。

        - スコープ内に作成した項目は、他のスコープを明示的に指定した場合を除き、項目が作成され
          たスコープ内でのみ変更できます。


    スコープ内に項目を作成したときに、その項目の名前が他のスコープ内にある項目と同じ名前である場合、
    元の項目が新しい項目で隠される可能性があります。ただし、元の項目が新しい項目で上書きされたり
    変更されたりすることはありません。


  Windows PowerShell のスコープ

    Windows PowerShell のスコープは、名前と番号の両方を持ちます。名前付きスコープは、絶対
    スコープを表します。番号は相対的な番号であり、スコープどうしの関係を示します。


    グローバル:
        Windows PowerShell を起動したときに有効になるスコープです。Windows PowerShell の起動
        時に存在する変数および関数は、グローバル スコープ内に作成されています。これには、
        自動変数やユーザー設定変数が含まれます。さらに、Windows PowerShell プロファイルに
        定義されている変数、エイリアス、および関数も含まれます。

    ローカル:
        現在のスコープです。グローバル スコープまたは他のスコープがローカル スコープになります。

    スクリプト:
        スクリプト ファイルの実行中に作成されるスコープです。スクリプト スコープでは、スクリプ
        ト内のコマンドのみが実行されます。スクリプト内のコマンドにとっては、スクリプト スコープ
        がローカル スコープとなります。

    プライベート:
        プライベート スコープ内の項目は、現在のスコープの外部からはアクセスできません。
        プライベート スコープを使用すると、別のスコープに存在する項目と同じ名前でプライベート 
        バージョンの項目を作成できます。        

    番号付きスコープ:
        スコープは、名前のほか、スコープどうしの相対位置を示す番号で参照することもできます。
        スコープ 0 は、現在のスコープ、つまりローカル スコープを表します。スコープ 1 は、直接
        の親スコープを表します。スコープ 2 は親スコープの親を表し、以降も同様に番号が割り当てられ
        ます。番号付きスコープは、再帰的なスコープを多数作成した場合に便利です。


 親スコープと子スコープ
 
    新しいスコープは、スクリプトまたは関数を実行したとき、セッションを作成したとき、または 
    Windows PowerShell の新しいインスタンスを起動したときに作成されます。新しいスコープを作成した結
    果は、親スコープ (元のスコープ) と子スコープ (作成したスコープ) になります。


    Windows PowerShell では、すべてのスコープがグローバル スコープの子スコープとなりますが、多数
    のスコープおよび再帰的なスコープを作成できます。


    項目を明示的にプライベートとして宣言しない限り、親スコープ内の項目を子スコープで使用できます。
    ただし、子スコープ内で作成および変更した項目は、項目の作成時にスコープを明示的に指定しない限り、
    親スコープに影響しません。

    
 継承
 
    子スコープは、変数、エイリアス、および関数を親スコープから継承しません。項目がプライベートとして
    宣言されていない限り、子スコープで親スコープ内の項目を認識できます。親スコープを明示的に指定して
    項目を変更することはできますが、その項目は子スコープには属しません。


    ただし、子スコープは、一式の項目と共に作成されます。通常、子スコープには、AllScope オプシ
    ョンを持つすべてのエイリアスが含まれます。このオプションについては、このトピックの後の方で説
    明します。子スコープには、AllScope オプションを持つすべての変数と、スコープをカスタマイズする
    ために使用できる一部の変数 (MaximumFunctionCount など) が含まれます。


    特定のスコープ内の項目を見つけるには、Get-Variable または Get-Alias の Scope パラメーター
    を使用します。


    たとえば、ローカル スコープ内のすべての変数を取得するには、次のように入力します。

	get-variable -scope local


    グローバル スコープ内のすべての変数を取得するには、次のように入力します。

	get-variable -scope global


 スコープ修飾子
 
    新しい変数、エイリアス、または関数のスコープを指定するには、スコープ修飾子を使用します。修
    飾子の有効な値は、Global および Script です。


    変数内でのスコープ修飾子の構文を次に示します。

        $[<scope-modifier>]:<name> = <value>


    関数内でのスコープ修飾子の構文を次に示します。

        function [<scope-modifier>]:<name> {<function-body>}


    スクリプトの既定のスコープは、スクリプト スコープです。関数およびエイリアスの既定のスコープ
    は、スクリプト内で定義される場合でも、ローカル スコープです。
 
 
    スコープ修飾子が使用されていない次のコマンドは、現在のスコープ、つまりローカル スコープに変
    数を作成します。

       $a = "one"

 
    同じ変数をグローバル スコープ内に作成するには、次のように Global スコープ修飾子を使用します。

       $global:a = "one"


    同じ変数をスクリプト スコープ内に作成するには、次のように Script スコープ修飾子を使用します。

       $script:a = "one"


    スコープ修飾子は、関数内で使用することもできます。次の関数定義は、グローバル スコープ内に関
    数を作成します。

       function global:Hello
       {
	    write-host "Hello, World"
       }


    また、スコープ修飾子を使用して、異なるスコープにある変数を参照できます。次のコマンドは、最
    初にローカル スコープ内の $test 変数を参照し、次にグローバル スコープ内の $test 変数を参照します。

      $test
	
      $global:test


 AllScope オプション
 
    変数およびエイリアスには、AllScope の値を受け取ることができる Option プロパティがありま
    す。AllScope プロパティを持つ項目は、さかのぼって親スコープに継承されることはありませんが、作
    成した子スコープに属します。


    AllScope プロパティを持つ項目は、子スコープ内で可視であり、このスコープに属します。任意のス
    コープ内の項目に変更を加えると、変数が定義されているすべてのスコープが影響を受けます。


 スコープの管理
 
    いくつかのコマンドレットには、特定のスコープに対して項目の設定または取得 (作成および変更) 
    を行うための Scope パラメーターが用意されています。次のコマンドを使用すると、セッション内
    で Scope パラメーターを持つすべてのコマンドレットが検索されます。

         get-help * -parameter scope


    特定のスコープで可視の変数を見つけるには、Get-Variable の Scope パラメーターを使用します。
    可視のパラメーターとしては、グローバル パラメーター、親スコープ内のパラメーター、および現在
    のスコープ内のパラメーターがあります。


    たとえば、次のコマンドは、ローカル スコープ内で可視の変数を取得します。

        get-variable -scope local


    特定のスコープ内に変数を作成するには、スコープ修飾子または Set-Variable の Scope パラメー
    ターを使用します。次のコマンドは、グローバル スコープ内に変数を作成します。

	new-variable -scope global -name a -value "One"


    また、New-Alias、Set-Alias、または Get-Alias の各コマンドレットの Scope パラメーターを
    使用してスコープを指定することもできます。次のコマンドは、グローバル スコープ内にエイリアス
    を作成します。

	new-alias -scope global -name np -value Notepad.exe


    特定のスコープ内の関数を取得するには、対象のスコープ内で Get-Item コマンドレットを使用しま
    す。Get-Item コマンドレットには、Scope パラメーターがありません。


 スコープでのドット ソース表記の使用
 
    スクリプトおよび関数は、スコープのすべての規則に従います。スクリプトおよび関数は特定のスコ
    ープ内に作成され、コマンドレット パラメーターまたはスコープ修飾子を使用してスコープを変更し
    ない限り、このスコープのみに作用します。


    ただし、ドット ソース表記を使用することで、スクリプトまたは関数を現在のスコープに追加できま
    す。この場合、スクリプトが現在のスコープ内で実行されると、スクリプトによって作成されるすべて
    の関数、エイリアス、および変数が現在のスコープで利用可能になります。
 

    関数を現在のスコープに追加するには、関数呼び出しでの関数のパスと名前の前に、ドット (.) と
    空白を入力します。


    たとえば、スクリプト スコープ (スクリプトの既定スコープ) で C:\Scripts ディレクトリから 
    Sample.ps1 スクリプトを実行するには、次のコマンドを使用します。

        c:\scripts\sample.ps1


    ローカル スコープ内で Sample.ps1 スクリプトを実行するには、次のコマンドを使用します。

        . c:\scripts.sample.ps1

   
    呼び出し演算子 (&) を使用して関数またはスクリプトを実行すると、関数またはスクリプトは現在
    のスコープに追加されません。次の例では、呼び出し演算子を使用しています。

        & c:\scripts.sample.ps1


    Sample.ps1 スクリプトによって作成されるすべてのエイリアス、関数、または変数は、現在のスコー
    プでは利用できません。


 スコープを使用しない制限
 
    Windows PowerShell のいくつかの概念は、スコープと類似しているか、またはスコープと相互に
    影響します。これらの概念は、スコープまたはスコープの動作と混同されることがあります。


    セッション、モジュール、および入れ子になったプロンプトは、自己完結型の環境ですが、セッショ
    ンのグローバル スコープの子スコープではありません。


    セッション:
        セッションとは、Windows PowerShell が実行される環境のことです。
        リモート コンピューター上にセッションを作成すると、Windows PowerShell はリモート コン
        ピューターに対する固定接続を確立します。この固定接続により、複数の関連コマンドでセッショ
        ンを使用できます。
 

        セッションは完結型の環境であるため、独自のスコープを持ちます。しかし、セッションは、作成されたセッションの
        子スコープではありません。セッションは、独自のグローバル スコープで開始されます。このスコープは、
        セッションのグローバル スコープから独立しています。セッション内では子スコープを作成できます。
        たとえば、セッション内で子スコープを作成するスクリプトを実行できます。

    モジュール:
        Windows PowerShell モジュールを使用して、Windows PowerShell ツールを共有および提供できま
        す。モジュールとは、コマンドレット、スクリプト、関数、変数、エイリアス、その他の有用な項
        目を含むことができる 1 つの単位です。明示的に定義しない限り、モジュール内の項目にモジュー
        ル外部からアクセスすることはできません。したがって、モジュールをセッションに追加した場
        合、セッション内のコマンドレット、スクリプト、関数、その他の項目が他の項目によって上書き
        される心配をする必要なく、パブリック項目を使用できます。


        モジュールのプライバシーはスコープと同様に動作しますが、モジュールをセッションに追加してもスコープは
        変更されません。また、モジュールは独自のスコープを持ちません。一方、モジュール内のスクリプトは、
        すべての Windows PowerShell スクリプトと同様に、独自のスコープを持ちます。


    入れ子になったプロンプト:
        同様に、入れ子になったプロンプトも独自のスコープを持ちません。入れ子になったプロンプトを入力した場合、
        入れ子になったプロンプトは環境のサブセットとなります。ただし、スコープはローカル スコープのままです。


        スクリプトは、独自のスコープを持ちます。スクリプトのデバッグ中にスクリプト内のブレーク
        ポイントに到達すると、スクリプト スコープに入ります。


    Private オプション:
        エイリアスおよび変数には、Private の値を受け取ることができる Option プロパティがあり
        ます。Private オプションを持つ項目は、項目が作成されたスコープ内で参照および変更できま
        すが、このスコープの外部で参照または変更することはできません。


        たとえば、Private オプションを持つ変数をグローバル スコープ内で作成し、スクリプトを実行
        したとき、スクリプト内の Get-Variable コマンドはプライベート変数を表示しません。この状
        況は、グローバル スコープ修飾子を使用した場合でも発生します。
   

        Option プロパティの値を Private に設定するには、New-Variable、Set-Variable、New-
        Alias、および Set-Alias の各コマンドレットの Option パラメーターを使用します。


    Visibility:
        変数またはエイリアスの Visibility プロパティは、変数またはエイリアスが作成されたコンテナ
        ー外の項目 (たとえばモジュール) を認識できるかどうかを決定します。Option プロパティの 
        Private 値がスコープ用であるように、Visibility はコンテナー用に設計されています。


        Visibility プロパティは、値 Public および Private を受け取ります。プライベートな
        可視性を持つ項目は、その項目が作成されたコンテナー内でのみ参照および変更できます。コンテ
        ナーを追加またはインポートする場合、プライベートな可視性を持つ項目を参照または変更することはできません。


        Visibility はコンテナー用に設計されているので、スコープ内では異なる動作になります。プライ
        ベートな可視性を持つ項目をグローバル スコープに作成した場合、どのスコープにおいてもこの
        項目を参照または変更できません。プライベートな可視性を持つ変数の値を参照または変更しよう
        とすると、エラー メッセージが返されます。


        プライベートな可視性を持つ変数を作成するには、New-Variable コマンドレットおよび Set-
        Variable コマンドレットを使用します。

   
例

  例 1: スクリプトの変数の値のみを変更する

      次のコマンドは、スクリプト内の $ConfirmPreference 変数の値を変更します。グローバル スコープ
      は、変更された値の影響を受けません。

    
      最初に、ローカル スコープ内の $ConfirmPreference 変数の値を表示するために、次のコマンドを使
      用します。

          C:\PS> $ConfirmPreference
          High


      次のコマンドを含む Scope.ps1 スクリプトを作成します。

          $ConfirmPreference = "Low"
          "The value of `$ConfirmPreference is $ConfirmPreference."

      スクリプトを実行します。スクリプトにより、$ConfirmPreference 変数の値が変更され、その値が
      スクリプト スコープ内で報告されます。次のような出力が生成されます。

          The value of $ConfirmPreference is Low.

        
      次に、現在のスコープ内で $ConfirmPreference 変数の現在の値をテストします。

          C:\PS> $ConfirmPreference
          High

      
      この例から、スクリプト スコープ内の変数の値に加えられた変更が親スコープの変数の値に作用し
      ないことがわかります。


  例 2: 異なるスコープにある変数の値を参照する
      スコープ修飾子を使用すると、ローカル スコープと親スコープにある変数の値を参照できます。


      最初に、$test 変数をグローバル スコープに定義します。

	  $test = "Global"

      次に、$test 変数を定義する Sample.ps1 スクリプトを作成します。スクリプト内では、スコープ修飾
      子を使用して、$test 変数のグローバル バージョンまたはローカル バージョンを参照します。


          # In Sample.ps1

          $test = "Local"
          "The local value of `$test is $test."
          "The global value of `$test is $global:test."
    
      Sample.ps1 を実行すると、次のような出力が生成されます。
         
          The local value of $test is Local.
          The global value of $test is Global.


      スクリプトが完了したときにこのセッションで定義されているのは、$test のグローバル値のみで
      す。

          C:\PS> $test
          Global


  例 3: 親スコープの変数の値を変更する

      親スコープの変数の値は、Private オプションまたは別の方法を使用して項目を保護しない限り、参
      照および変更できます。


      最初に、$test 変数をグローバル スコープに定義します。

	  $test = "Global"


      次に、$test 変数を定義する Sample.ps1 スクリプトを作成します。スクリプト内では、スコープ修飾
      子を使用して、$test 変数のグローバル バージョンまたはローカル バージョンを参照します。

          # Sample.ps1

          $global:test = "Local"
          "The global value of `$test is $global:test."

        
      スクリプトが完了したとき、$test のグローバル値は変更されています。

          C:\PS> $test
          Local
          

  例 4: プライベート変数を作成する

      プライベート変数とは、Option プロパティの値が Private に設定されている変数です。プラ
      イベート変数は子スコープによって継承されますが、変数が作成されたスコープ内でのみ参照または
      変更できます。


      次のコマンドは、$ptest という名前のプライベート変数をローカル スコープ内で作成します。

	  new-variable -name ptest -value 1 -option private


      $ptest の値は、ローカル スコープ内で表示および変更できます。

	  C:\PS> $ptest
          1
          C:\PS> $ptest = 2
          C:\PS> $ptest
	  2
         
      
      次に、次のコマンドを含む Sample.ps1 スクリプトを作成します。
      このコマンドは、$ptest の値を表示および変更しようとします。

          # Sample.ps1

          "The value of `$Ptest is $Ptest."
      	  "The value of `$Ptest is $global:Ptest."

    
      $ptest 変数はスクリプト スコープ内で参照できないので、出力は空になります。
    
          "The value of $Ptest is ."
      	  "The value of $Ptest is ."
        
   
関連項目
    about_Variables
    about_Environment_Variables
    about_Functions
    about_Script_Blocks




目次