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 |