about_Scopes
簡単な説明
PowerShell のスコープの概念と、要素のスコープを設定および変更する方法について説明します。
詳細な説明
PowerShell は、変数、エイリアス、関数、PowerShell ドライブ (PSDrive) へのアクセスを、読み取りおよび変更できる場所を制限することで保護します。 PowerShell では、スコープ ルールを使用して、他のスコープ内のアイテムに意図しない変更を加えないようにします。
スコープ規則
PowerShell を起動すると、ホスト (pwsh.exe
) によって PowerShell 実行空間が作成されます。
ホスト プロセスには複数の実行空間を含めることができます。 各実行空間には、独自のセッション状態とスコープ コンテナーがあります。 セッションの状態とスコープは、実行空間インスタンス間でアクセスできません。
スコープの基本的な規則を次に示します。
- スコープは入れ子になる場合があります。 外部スコープは親スコープと呼ばれます。 入れ子になったスコープは、その親の子スコープです。
- アイテムは、明示的にプライベートにしない限り、作成されたスコープと子スコープに表示されます。
- 現在のスコープ外のスコープに対して、変数、エイリアス、関数、PowerShell ドライブを宣言できます。
- スコープ内で作成した項目は、別のスコープを明示的に指定しない限り、作成されたスコープ内でのみ変更できます。
- 実行空間で実行されているコードが項目を参照する場合、PowerShell はスコープ階層を検索します。現在のスコープから始まり、各親スコープを続行します。
- 項目が見つからない場合は、現在のスコープに新しい項目が作成されます。
- 一致が見つかった場合、項目の値は、検出されたスコープから取得されます。
- 値を変更すると、アイテムが現在のスコープにコピーされるため、変更は現在のスコープにのみ影響します。
- 別のスコープ内のアイテムと名前を共有するアイテムを明示的に作成した場合、元のアイテムは新しいアイテムによって非表示になる可能性がありますが、オーバーライドされたり変更されたりすることはありません。
親スコープと子スコープ
スクリプトまたは関数を呼び出すことで、新しい子スコープを作成できます。 呼び出し元のスコープは親スコープです。 呼び出されたスクリプトまたは関数は子スコープです。 呼び出す関数またはスクリプトは、他の関数を呼び出して、ルート スコープがグローバル スコープである子スコープの階層を作成する場合があります。
Note
モジュールの関数は、呼び出し元スコープの子スコープでは実行されません。 モジュールには、モジュールがインポートされたスコープにリンクされた独自のセッション状態があります。 すべてのモジュール コードは、独自のルート スコープを持つスコープのモジュール固有の階層で実行されます。 詳細については、この記事の「 Modules 」セクションを参照してください。
子スコープが作成されると、 AllScope オプションを持つすべてのエイリアスと変数と、いくつかの自動変数が含まれます。 このオプションについては、この記事の後半で説明します。
明示的にアイテムをプライベートにしない限り、親スコープ内の項目は子スコープで使用できます。 子スコープで作成または変更した項目は、アイテムの作成時にスコープを明示的に指定しない限り、親スコープには影響しません。
特定のスコープ内の項目を検索するには、 Get-Variable
または Get-Alias
の Scope パラメーターを使用します。
たとえば、ローカル スコープ内のすべての変数を取得するには、次のように入力します。
Get-Variable -Scope local
グローバル スコープ内のすべての変数を取得するには、次のように入力します。
Get-Variable -Scope global
変数、エイリアス、または関数への参照が行われると、PowerShell は現在のスコープを検索します。 アイテムが見つからない場合は、親スコープが検索されます。 この検索は、グローバル スコープまで繰り返されます。 変数が親スコープでプライベートである場合、検索はスコープ チェーンを通じて続行されます。 例 4 は、スコープ検索におけるプライベート変数の効果を示しています。
PowerShell のスコープ名
PowerShell では、一部のスコープの名前を定義して、そのスコープに簡単にアクセスできるようにします。 PowerShell では、次の名前付きスコープを定義します。
- グローバル: PowerShell の起動時または新しいセッションまたは実行空間の作成時に有効なスコープ。 PowerShell の起動時に存在する変数と関数 (自動変数や基本設定変数など) は、グローバル スコープで作成されます。 PowerShell プロファイルの変数、エイリアス、関数もグローバル スコープで作成されます。 グローバル スコープは、実行空間内のルート親スコープです。
- ローカル: 現在のスコープ。 ローカル スコープには、グローバル スコープまたはその他のスコープを指定できます。
- スクリプト: スクリプト ファイルの実行中に作成されるスコープ。 スクリプト内のコマンドは、スクリプト スコープで実行されます。 スクリプト内のコマンドの場合、スクリプト スコープはローカル スコープです。
スコープをサポートするコマンドレットの場合、スコープは、あるスコープの相対的な位置を表す数値で参照できます。 スコープ 0 は現在の (ローカル) スコープを表し、スコープ 1 は現在のスコープの親であり、スコープ 2 は現在のスコープの祖父母です。 このパターンは、ルート スコープに達するまで続行されます。
スコープ修飾子
変数、エイリアス、または関数名には、次の省略可能なスコープ修飾子のいずれかを含めることができます。
global:
- Global スコープに名前が存在することを指定します。local:
- 名前が Local スコープに存在することを指定します。 現在のスコープは常に Local スコープです。private:
- 名前が Private 現在のスコープにのみ表示されることを指定します。Note
private:
はスコープではありません。 これは オプション 定義されているスコープ外の項目のアクセシビリティを変更します。script:
- Script スコープに名前が存在することを指定します。 Script scope は、最も近い先祖スクリプト ファイルのスコープまたは Global 最も近い先祖スクリプト ファイルがない場合です。using:
- リモート セッション、バックグラウンド ジョブ、またはスレッド ジョブで実行中に、別のスコープで定義された変数にアクセスするために使用されます。workflow:
- ワークフロー内に名前が存在することを指定します。 注: ワークフローは、PowerShell v6 以降ではサポートされていません。<variable-namespace>
- PowerShell PSDrive プロバイダーによって作成された修飾子。 次に例を示します。名前空間 説明 Alias:
現在のスコープで定義されているエイリアス Env:
現在のスコープで定義されている環境変数 Function:
現在のスコープで定義されている関数 Variable:
現在のスコープで定義されている変数
スクリプトの既定のスコープはスクリプト スコープです。 関数とエイリアスの既定のスコープは、スクリプトで定義されている場合でもローカル スコープです。
スコープ修飾子の使用
新しい変数、エイリアス、または関数のスコープを指定するには、スコープ修飾子を使用します。
変数内のスコープ修飾子の構文は次のとおりです。
$[<scope-modifier>:]<name> = <value>
関数内のスコープ修飾子の構文は次のとおりです。
function [<scope-modifier>:]<name> {<function-body>}
スコープ修飾子を使用しない次のコマンドは、現在のスコープまたは local スコープに変数を作成します。
$a = "one"
global スコープに同じ変数を作成するには、スコープglobal:
修飾子を使用します。
$global:a = "one"
Get-Variable a | Format-List *
Visibility プロパティ値と Options プロパティ値に注目してください。
Name : a
Description :
Value : one
Visibility : Public
Module :
ModuleName :
Options : None
Attributes : {}
これをプライベート変数と比較します。
$private:pVar = 'Private variable'
Get-Variable pVar | Format-List *
private
スコープ修飾子を使用すると、Options プロパティがPrivate
に設定されます。
Name : pVar
Description :
Value : Private variable
Visibility : Public
Module :
ModuleName :
Options : Private
Attributes : {}
script スコープに同じ変数を作成するには、script:
スコープ修飾子を使用します。
$script:a = "one"
関数でスコープ修飾子を使用することもできます。 次の関数定義では、 global スコープに関数が作成されます。
function global:Hello {
Write-Host "Hello, World"
}
また、スコープ修飾子を使用して、別のスコープ内の変数を参照することもできます。
次のコマンドは、最初にローカル スコープで、次にグローバル スコープで、 $test
変数を参照します。
$test
$global:test
using:
スコープ修飾子
Using は、リモート コマンドでローカル変数を識別する特殊なスコープ修飾子です。 修飾子がない場合、PowerShell はリモート コマンドの変数がリモート セッションで定義されることを想定しています。
using
スコープ修飾子は、PowerShell 3.0 で導入されています。
セッション外で実行されるスクリプトまたはコマンドの場合は、呼び出し元のセッション スコープから変数値を埋め込むために、 using
スコープ修飾子が必要です。そのため、セッション外のコードがそれらにアクセスできます。 using
スコープ修飾子は、次のコンテキストでサポートされています。
- ComputerName、HostName、SSHConnection または Session パラメーター (リモート セッション) を使用して
Invoke-Command
で開始されたリモート実行コマンド Start-Job
で開始されたバックグラウンド ジョブ (アウトプロセス セッション)Start-ThreadJob
またはForEach-Object -Parallel
(個別のスレッド セッション) を使用して開始されたスレッド ジョブ
コンテキストに応じて、埋め込み変数の値は、呼び出し元のスコープ内のデータの独立したコピーか、それに対する参照のいずれかになります。 リモート セッションとアウトプロセス セッションでは、常に独立したコピーです。
詳細については、「 about_Remote_Variables」を参照してください。
$using:
参照は、変数の値にのみ拡張されます。 呼び出し元のスコープ内の変数の値を変更する場合は、変数自体への参照が必要です。 変数の PSVariable インスタンスを取得することで、変数への参照を作成できます。 次の例では、参照を作成し、スレッド ジョブに変更を加える方法を示します。
$Count = 1
$refOfCount = Get-Variable Count
Start-ThreadJob {
($using:refOfCount).Value = 2
} | Receive-Job -Wait -AutoRemoveJob
$Count
2
Note
これはスレッド セーフな操作ではありません。 複数のスレッドから値を同時に変更しようとすると、データの破損が発生する可能性があります。 共有データを保護するには、スレッド セーフなデータ型または同期プリミティブを使用する必要があります。 詳細については、「 Thread-Safe コレクション」を参照してください。
変数値のシリアル化
リモートで実行されたコマンドとバックグラウンド ジョブは、アウトプロセスで実行されます。 アウトプロセス セッションでは、XML ベースのシリアル化と逆シリアル化を使用して、プロセス境界を越えて変数の値を使用できるようにします。 シリアル化プロセスは、元のオブジェクトプロパティを含むがメソッドを含まない PSObject にオブジェクトを変換します。
型のセットが制限されている場合、逆シリアル化はオブジェクトを元の型にリハイドレートします。 リハイドレートされたオブジェクトは、元のオブジェクト インスタンスのコピーです。 型のプロパティとメソッドがあります。 System.Version などの単純型の場合、コピーは正確です。 複合型の場合、コピーは不完全です。 たとえば、リハイドレートされた証明書オブジェクトには秘密キーは含まれません。
他のすべての型のインスタンスは、 PSObject インスタンスです。 PSTypeNames プロパティには、Deserialized (たとえば、Deserialized.System.Data.DataTable) でプレフィックスが付いた元の型名が含まれています
AllScope オプション
変数とエイリアスには、 Option プロパティがあり、 AllScope の値を取得できます。 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 パラメーターがありません。
Note
Scope パラメーターを使用するコマンドレットでは、スコープを数値で参照することもできます。 この数値は、あるスコープから別のスコープへの相対位置を表します。 スコープ 0 は、現在のスコープまたはローカル スコープを表します。 スコープ 1 は、直接の親スコープを示します。 スコープ 2 は、親スコープの親などを示します。 番号付きスコープは、多くの再帰スコープを作成した場合に便利です。
スコープでのドット ソース表記の使用
スクリプトと関数は、スコープの規則に従います。 これらは特定のスコープに作成します。コマンドレット パラメーターまたはスコープ修飾子を使用してそのスコープを変更しない限り、そのスコープにのみ影響します。
ただし、ドット ソース表記を使用して、スクリプトまたは関数の内容を現在のスコープに追加できます。 ドット ソース表記を使用してスクリプトまたは関数を実行すると、現在のスコープで実行されます。 スクリプトまたは関数内のすべての関数、エイリアス、変数が現在のスコープに追加されます。
たとえば、スクリプト スコープ (スクリプトの既定) のC:\Scripts
ディレクトリからSample.ps1
スクリプトを実行するには、コマンド ラインにスクリプト ファイルへの完全なパスを入力します。
c:\scripts\sample.ps1
スクリプト ファイルを実行可能にするには、 .ps1
ファイル拡張子が必要です。 パスにスペースがあるファイルは、引用符で囲む必要があります。 引用符で囲まれたパスを実行しようとすると、スクリプトを実行する代わりに、PowerShell によって引用符で囲まれた文字列の内容が表示されます。 呼び出し演算子 (&
) を使用すると、ファイル名を含む文字列の内容を実行できます。
呼び出し演算子を使用して関数またはスクリプトを実行すると、スクリプト スコープで実行されます。 呼び出し演算子の使用は、スクリプトを名前で実行するのと同じ違いはありません。
& c:\scripts\sample.ps1
呼び出し演算子の詳細については、 about_Operatorsで確認できます。
ローカル スコープで Sample.ps1
スクリプトを実行するには、スクリプトへのパスの前にドットとスペース (.
) を入力します。
. c:\scripts\sample.ps1
これで、スクリプトで定義されているすべての関数、エイリアス、または変数が現在のスコープに追加されます。
スコープなしの制限
PowerShell には、スコープに似たいくつかのオプションと機能があり、スコープと対話する可能性があります。 これらの機能は、スコープまたはスコープの動作と混同される可能性があります。
セッション、モジュール、入れ子になったプロンプトは自己完結型の環境であり、セッション内のグローバル スコープの子スコープではありません。
セッション
セッションは、PowerShell を実行する環境です。 リモート コンピューターでセッションを作成すると、PowerShell によってリモート コンピューターへの永続的な接続が確立されます。 永続的な接続を使用すると、複数の関連コマンドにセッションを使用できます。
セッションは包含環境であるため、独自のスコープを持ちますが、セッションは作成されたセッションの子スコープではありません。 セッションは、独自のグローバル スコープで開始されます。 このスコープは、セッションのグローバル スコープとは無関係です。 セッションで子スコープを作成できます。 たとえば、スクリプトを実行して、セッションに子スコープを作成できます。
モジュール
PowerShell モジュールを使用して、PowerShell ツールを共有および配信できます。 モジュールは、コマンドレット、スクリプト、関数、変数、エイリアス、およびその他の便利な項目を含めることができるユニットです。 明示的にエクスポートしない限り ( Export-ModuleMember
またはモジュール マニフェストを使用)、モジュール内の項目にはモジュールの外部からアクセスできません。 そのため、セッションにモジュールを追加し、他の項目がセッション内のコマンドレット、スクリプト、関数、およびその他の項目をオーバーライドする可能性があることを気にせずにパブリック項目を使用できます。
既定では、モジュールは実行空間のルート レベル (グローバル) スコープに読み込まれます。 モジュールをインポートしても、スコープは変更されません。
セッション内では、モジュールには独自のスコープがあります。 次のモジュールの C:\temp\mod1.psm1
について考えてみます。
$a = "Hello"
function foo {
"`$a = $a"
"`$global:a = $global:a"
}
次に、グローバル変数 $a
を作成し、値を指定して関数 fooを呼び出します。
$a = "Goodbye"
foo
モジュールは、モジュール スコープで変数 $a
を宣言し、関数 foo 両方のスコープの変数の値を出力します。
$a = Hello
$global:a = Goodbye
モジュールは、インポートされたスコープにリンクされた並列スコープ コンテナーを作成します。 モジュールによってエクスポートされた項目は、インポートされるスコープ レベルから使用できます。 モジュールからエクスポートされない項目は、モジュールのスコープ コンテナー内でのみ使用できます。 モジュール内の関数は、インポートされたスコープ内の項目と、モジュールのスコープ コンテナー内の項目にアクセスできます。
within Module1 から Module2 を読み込む場合、Module2 は Module1 のスコープ コンテナーに読み込まれます。 Module2 からのエクスポートはすべて、Module1 の現在のモジュール スコープに配置されます。 Import-Module -Scope local
を使用する場合、エクスポートは最上位ではなく、現在のスコープ オブジェクトに配置されます。 モジュールにしImport-Module -Scope global
(またはImport-Module -Global
) を使用して別のモジュールを読み込む場合、そのモジュールとそのエクスポートは、モジュールのローカル スコープではなくグローバル スコープに読み込まれます。
WindowsCompatibility 機能は、プロキシ モジュールをグローバル セッション状態にインポートするためにこれを行います。
入れ子になったプロンプト
入れ子になったプロンプトには、独自のスコープがありません。 入れ子になったプロンプトを入力すると、入れ子になったプロンプトは環境のサブセットになります。 ただし、ローカル スコープ内に残ります。
スクリプトには独自のスコープがあります。 スクリプトをデバッグしていて、スクリプトのブレークポイントに到達した場合は、スクリプト スコープを入力します。
プライベート オプション
エイリアスと変数には、Private
の値を受け取ることができる Option プロパティがあります。 Private
オプションを持つ項目は、作成されたスコープで表示および変更できますが、そのスコープ外で表示または変更することはできません。
たとえば、グローバル スコープでプライベート オプションを持つ変数を作成し、スクリプトを実行した場合、スクリプト内の Get-Variable
コマンドはプライベート変数を表示しません。 このインスタンスでグローバル スコープ修飾子を使用しても、プライベート変数は表示されません。
New-Variable
、Set-Variable
、New-Alias
、および Set-Alias
コマンドレットの Option パラメーターを使用して、Option プロパティの値を Private に設定できます。
視程
変数またはエイリアスの Visibility プロパティは、作成されたコンテナーの外部にアイテムを表示できるかどうかを決定します。 コンテナーには、モジュール、スクリプト、またはスナップインを指定できます。 可視性は、Option プロパティのPrivate
値がスコープ用に設計されているのと同じ方法でコンテナー用に設計されています。
Visibility プロパティは、Public
とPrivate
の値を受け取ります。 プライベート可視性を持つ項目は、作成されたコンテナーでのみ表示および変更できます。 コンテナーが追加またはインポートされた場合、プライベート可視性を持つ項目は表示または変更できません。
可視性はコンテナー用に設計されているため、スコープ内では動作が異なります。
- グローバル スコープで非公開の可視性を持つアイテムを作成した場合、どのスコープでもアイテムを表示または変更することはできません。
- プライベート可視性を持つ変数の値を表示または変更しようとすると、PowerShell はエラー メッセージを返します。
New-Variable
コマンドレットとSet-Variable
コマンドレットを使用して、プライベート可視性を持つ変数を作成できます。
例
例 1: スクリプト内でのみ変数値を変更する
次のコマンドは、スクリプト内の $ConfirmPreference
変数の値を変更します。 この変更はグローバル スコープには影響しません。
最初に、ローカル スコープ内の $ConfirmPreference
変数の値を表示するには、次のコマンドを使用します。
PS> $ConfirmPreference
High
次のコマンドを含む Scope.ps1 スクリプトを作成します。
$ConfirmPreference = "Low"
"The value of `$ConfirmPreference is $ConfirmPreference."
スクリプトを実行します。 スクリプトは、 $ConfirmPreference
変数の値を変更し、スクリプト スコープでその値を報告します。 出力は次の出力のようになります。
The value of $ConfirmPreference is Low.
次に、現在のスコープ内の $ConfirmPreference
変数の現在の値をテストします。
PS> $ConfirmPreference
High
この例は、スクリプト スコープ内の変数の値に対する変更が、親スコープ内の変数の値に影響しないことを示しています。
例 2: 異なるスコープ内の変数値を表示する
スコープ修飾子を使用して、ローカル スコープと親スコープ内の変数の値を表示できます。
まず、グローバル スコープで $test
変数を定義します。
$test = "Global"
次に、$test
変数を定義するSample.ps1
スクリプトを作成します。 このスクリプトでは、スコープ修飾子を使用して、 $test
変数のグローバル バージョンまたはローカル バージョンを参照します。
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
のグローバル値のみがセッションで定義されます。
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
のグローバル値が変更されます。
PS> $test
Local
例 4: プライベート変数の作成
変数は、 private:
スコープ修飾子を使用するか、 Option プロパティを Private
に設定して変数を作成することによってプライベートにすることができます。 プライベート変数は、作成されたスコープでのみ表示または変更できます。
この例では、 ScopeExample.ps1
スクリプトによって 5 つの関数が作成されます。 最初の関数は、子スコープを作成する次の関数を呼び出します。 関数の 1 つに、作成されたスコープでのみ表示できるプライベート変数があります。
PS> Get-Content ScopeExample.ps1
# Start of ScopeExample.ps1
function funcA {
"Setting `$funcAVar1 to 'Value set in funcA'"
$funcAVar1 = "Value set in funcA"
funcB
}
function funcB {
"In funcB before set -> '$funcAVar1'"
$private:funcAVar1 = "Locally overwrite the value - child scopes can't see me!"
"In funcB after set -> '$funcAVar1'"
funcC
}
function funcC {
"In funcC before set -> '$funcAVar1' - should be the value set in funcA"
$funcAVar1 = "Value set in funcC - Child scopes can see this change."
"In funcC after set -> '$funcAVar1'"
funcD
}
function funcD {
"In funcD before set -> '$funcAVar1' - should be the value from funcC."
$funcAVar1 = "Value set in funcD"
"In funcD after set -> '$funcAVar1'"
'-------------------'
ShowScopes
}
function ShowScopes {
$funcAVar1 = "Value set in ShowScopes"
"Scope [0] (local) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 0 -ValueOnly)'"
"Scope [1] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 1 -ValueOnly)'"
"Scope [2] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 2 -ValueOnly)'"
"Scope [3] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 3 -ValueOnly)'"
"Scope [4] (parent) `$funcAVar1 = '$(Get-Variable funcAVar1 -Scope 4 -ValueOnly)'"
}
funcA
# End of ScopeExample.ps1
PS> .\ScopeExample.ps1
出力には、各スコープ内の変数の値が表示されます。 プライベート変数は、作成されたスコープである funcB
でのみ表示されることがわかります。
Setting $funcAVar1 to 'Value set in funcA'
In funcB before set -> 'Value set in funcA'
In funcB after set -> 'Locally overwrite the value - child scopes can't see me!'
In funcC before set -> 'Value set in funcA' - should be the value set in funcA
In funcC after set -> 'Value set in funcC - Child scopes can see this change.'
In funcD before set -> 'Value set in funcC - Child scopes can see this change.' - should be the value from funcC.
In funcD after set -> 'Value set in funcD'
-------------------
Scope [0] (local) $funcAVar1 = 'Value set in ShowScopes'
Scope [1] (parent) $funcAVar1 = 'Value set in funcD'
Scope [2] (parent) $funcAVar1 = 'Value set in funcC - Child scopes can see this change.'
Scope [3] (parent) $funcAVar1 = 'Locally overwrite the value - child scopes can't see me!'
Scope [4] (parent) $funcAVar1 = 'Value set in funcA'
ShowScopes
からの出力で示されているように、Get-Variable
を使用して他のスコープの変数にアクセスし、スコープ番号を指定できます。
例 5: リモート・コマンドでのローカル変数の使用
ローカル セッションで作成されたリモート コマンドの変数の場合は、 using
スコープ修飾子を使用します。 PowerShell では、リモート コマンドの変数がリモート セッションで作成されたものと想定しています。
構文は次のとおりです。
$using:<VariableName>
たとえば、次のコマンドは、ローカル セッションで $Cred
変数を作成し、リモート コマンドで $Cred
変数を使用します。
$Cred = Get-Credential
Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $using:Cred}
using
スコープ修飾子は、PowerShell 3.0 で導入されました。
関連項目
PowerShell