プライベートスコープ
変数のスコープの種類には、プライベートスコープもあります。下記スクリプトで説明します。
$a = 3
function funcA
{
Write-Host "2)$a"
$a = "7"
Write-Host "3)$a"
funcB
}
function funcB
{
Write-Host "4)$a"
}
Write-Host "1)$a"
funcA
Write-Host "5)$a"
このスクリプトには2つの関数があり、最初にfuncAを呼び出し、funcAの中からfuncBを呼び出しています。またソース内での1)~5)は分かりやすいように実行順を示しています。
このスクリプトの実行結果は下記の通りです。
PS C:\Work> ./Scope3.ps1 1)3 2)3 3)7 4)7 5)3
このスクリプトの動作について図で説明します。

1行目の変数$aはスクリプトスコープを持つ変数となるので、有効期間は赤線の通りでスクリプトファイルの最後までです。
次に6行目の変数$aですが、この変数はローカル変数となりfuncAが有効期間です。
さらに、この関数funcAはfuncBを呼び出しており、funcAで作成したローカル変数$aの有効期間は青線で示した箇所、つまりfuncBまでおよびます。
では、funcA内だけで有効なローカル変数を作成したい場合は、どうすれば良いでしょうか?
これを実現するにはprivate修飾子を使用します。
下記は「Scope3.ps1」をprivate修飾子を使用して書き換えたものです。funcAのローカル変数のスコープがfuncBに及ばないようにしています(6行目でpraivateキーワードを付加しています)。
$a = 3
function funcA
{
Write-Host "2)$a"
$private:a = "7"
Write-Host "3)$a"
funcB
}
function funcB
{
Write-Host "4)$a"
}
Write-Host "1)$a"
funcA
Write-Host "5)$a"
このスクリプトの実行結果は下記の通りです。
PS C:\Work> ./Scope4.ps1 1)3 2)3 3)7 4)3 5)3
「Scope4.ps1」でのスコープを図で見てみましょう。

privateキーワードを使用したので、funcAのローカル変数$aのスコープは青線の部分となります。
