about_Scopes

適用対象: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

トピック

about_Scopes

概要

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

詳細説明

Windows PowerShell は、変数、エイリアス、関数、および Windows PowerShell ドライブ (PSDrive) を読み取りおよび変更できる場所を制限することによって、これらへのアクセスを保護します。Windows PowerShell では、スコープに対していくつか単純な規則を適用することで、変更対象外の項目が誤って変更されないようになっています。

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

  • - スコープに含めている項目は、明示的にプライベートにしていない限り、作成元のスコープと任意の子スコープで参照できます。変数、エイリアス、関数、または Windows PowerShell ドライブを 1 つまたは複数のスコープに配置できます。

  • - スコープ内に作成した項目は、異なるスコープを明示的に指定しない限り、作成元のスコープ内だけで変更できます。

スコープに項目を作成し、その項目が異なるスコープ内の項目と名前を共有している場合、作成した項目が共有先の項目の下に隠れてしまうことがあります。しかし、上書きされたり、変更されたりすることはありません。

Windows PowerShell のスコープ

Windows PowerShell のスコープには、名前と番号の両方があります。名前付きスコープには、絶対スコープを指定します。この番号は、相対的であり、スコープの間のリレーションシップを反映しています。

  • Global:
    Windows PowerShell が起動すると適用されるスコープ。Windows PowerShell がグローバル スコープで作成されたときに存在する変数と関数。これには、自動変数およびユーザー設定変数が含まれます。また、Windows PowerShell プロファイル内にある変数、エイリアス、および関数も含まれます。
  • Local:
    現在のスコープです。ローカル スコープは、グローバル スコープにすることも、その他の任意のスコープにすることもできます。
  • Script:
    スクリプト ファイルの実行中に作成されるスコープです。スクリプトのコマンドだけが、スクリプト スコープで実行されます。スクリプトのコマンドにとって、スクリプト スコープはローカル スコープです。
  • Private:
    プライベート スコープ内の項目を現在のスコープ外で参照することはできません。プライベート スコープを使用すると、別のスコープに同じ名前のプライベート バージョンの項目を作成できます。
  • 番号付きスコープ:
    スコープ間の相対位置を示す名前または番号でスコープを参照できます。スコープ 0 は、現在の (またはローカルの) スコープを表します。スコープ 1 は、直属の親スコープを示します。スコープ 2 は、親スコープの親を示し、以後同様に続きます。番号付きスコープは、多くの再帰スコープを作成した場合に便利です。

親と子のスコープ

新しいスコープを作成するには、スクリプトまたは関数を実行するか、セッションを作成するか、または Windows PowerShell の新しいインスタンスを開始します。新しいスコープを作成すると、親スコープ (元のスコープ) と子スコープ (作成したスコープ) が作成されます。

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

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

継承

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

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

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

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

        get-variable -scope local

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

        get-variable -scope global

スコープ修飾子

新しい変数、エイリアス、または関数のスコープを指定するには、スコープ修飾子を使用します。修飾子の有効な値は、Global、Local、Private、および 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

      $global:test

Using スコープ修飾子

Using は、リモート コマンド内のローカル変数を識別する特殊なスコープ修飾子です。既定では、リモート コマンドの変数はリモート セッションに定義されていると見なされます。

Using スコープ修飾子は、Windows PowerShell 3.0 で導入されました。

詳細については、「about_Remote_Variables」を参照してください。

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 ツールを共有および配布できます。モジュールは、コマンドレット、スクリプト、関数、変数、エイリアス、およびその他の有益な項目を含めることができる単位です。明示的に定義されていない限り、モジュール内の項目にモジュール外からアクセスすることはできません。そのため、セッションのコマンドレット、スクリプト、関数、およびその他の項目が他の項目で上書きされる可能性を心配することなく、モジュールをセッションに追加し、パブリック項目を使用できます。

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

  • 入れ子になったプロンプト:
    同様に、入れ子になったプロンプトにも、独自のスコープはありません。入れ子になったプロンプトに入ると、入れ子になったプロンプトは環境のサブセットになります。ただし、ローカル スコープ内に残ります。

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

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

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

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

  • 可視性:
    変数またはエイリアスの Visibility プロパティによって、変数またはエイリアスをその作成元のコンテナー (モジュールなど) 外で参照できるかどうかが決まります。Option プロパティの Private 値がスコープ向けに設計されているのと同じように、Visibility はコンテナー向けに設定されています。

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

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

    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 変数を参照します。

          # In 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 の値を表示および変更しようとします。

          # In 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 ."

例 5:リモート コマンドでローカル変数を使用する

リモート コマンド内の変数がローカル セッションで作成されたことを示すには、Using スコープ修飾子を使用します。既定では、Windows PowerShell はリモート コマンド内の変数がリモート セッションで作成されたと見なします。

次に構文を示します。

           $Using:<VariableName>

たとえば、次のコマンドはローカル セッションで $Cred 変数を作成し、その $Cred 変数をリモート コマンドで使用します。

           $Cred = Get-Credential
           Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $Using:Cred}

Using スコープは、Windows PowerShell 3.0 で導入されました。

Windows PowerShell 2.0 で、変数がローカル セッションで作成されたことを示すには、次のコマンド形式を使用します。

           $Cred = Get-Credential
           Invoke-Command $s {param($c) Remove-Item .\Test*.ps1 -Credential $c} -ArgumentList $Cred

関連項目

about_Variables

about_Environment_Variables

about_Functions

about_Script_Blocks