PowerShell HelpFile - about_scopes
 記事記号:[me1577] 初版:2011/May/10

この文書は、Windows PowerShellのヘルプ機能で表示される内容を再構成したものです。

トピック
    about_Scopes

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

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


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

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

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


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


  Windows PowerShell のスコープ

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


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

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

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

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

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


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


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


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

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


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


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


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

	get-variable -scope local


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

	get-variable -scope global


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


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

        $[]: = 


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

        function []: {}


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

       $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 の S
    cope パラメーターを使用します。次のコマンドは、グローバル スコープ内に変数を
    作成します。

	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 Pow
        erShell スクリプトと同様に、独自のスコープを持ちます。


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


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


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


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

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


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


        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
	
記事で解説しているパソコンの環境
 基本ソフト: Windows 7
 キーワード: Windows PowerShell、ヘルプ、HelpFile、about_scopes
ご利用数: 1857552
感想・要望・問い合わせは こちら