PowerShell の残念な点は、関数とスクリプト ブロックが動的にスコープされることです。
しかし、私が驚いたもう一つのことは、変数が内部スコープ内でコピーオンライトとして動作するということです。
$array=@("g")
function foo()
{
$array += "h"
Write-Host $array
}
& {
$array +="s"
Write-Host $array
}
foo
Write-Host $array
出力は次のようになります。
g s
g h
g
これにより、動的スコープの負担が少し軽減されます。しかし、コピーオンライトを回避するにはどうすればよいでしょうか?
ベストアンサー1
PowerShell スコープの記事 (スコープについて)は良いですが、冗長すぎるので、これは私の記事:
一般的に、PowerShell スコープは .NET スコープに似ています。次のようになります。
- グローバル公開されている
- 脚本内部です
- プライベート非公開です
- 地元現在のスタックレベル
- 番号付きスコープ0..N で、各ステップはスタック レベルまでです (0 はローカルです)
以下は、スコープの使用方法と効果を説明する簡単な例です。
$test = 'Global Scope'
Function Foo {
$test = 'Function Scope'
Write-Host $Global:test # Global Scope
Write-Host $Local:test # Function Scope
Write-Host $test # Function Scope
Write-Host (Get-Variable -Name test -ValueOnly -Scope 0) # Function Scope
Write-Host (Get-Variable -Name test -ValueOnly -Scope 1) # Global Scope
}
Foo
ご覧のとおり、$Global:test のような構文は名前付きスコープでのみ使用でき、$0:test は常に $null になります。