PowerShell での変数のスコープ 質問する

PowerShell での変数のスコープ 質問する

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 になります。

おすすめ記事