簡體   English   中英

引用全局變量時是否可以選擇使用 $global: 范圍前綴?

[英]Is it optional to use the $global: scope prefix when referencing a global variable?

如果我使用$global:MyVariable = "123"聲明並初始化一個 PowerShell 變量,那么我是否需要在任何我使用該變量的地方使用 $global: 還是可以只使用 $MyVariable?

  • 原則上,您可以僅使用$MyVariable來通過該名稱引用全局變量的值,但您可能會看到不同的變量值,具體情況。

  • 具體來說,如果任何介入的祖先(父)作用域甚至調用作用域本身創建了一個$MyVariable變量(通常通過簡單的賦值隱式發生;例如, $MyVariable = ... ,您將看到變量的值。

  • 只有使用全局范圍說明符才能保證看到全局值,即: $global:MyVariable (或Get-Variable -ValueOnly -Scope Global MyVariable[1]

  • 默認情況下,變量是可見的,但不能在所有后代(子)范圍內直接修改

    • 因此,您必須使用$global:MyVariable / Set-Variable -Scope Global修改(設置)全局變量 如果沒有$global:您將隱式創建一個同名的局部變量。
    • 有關 PowerShell 范圍規則的更多信息,請參閱此答案的最后一部分。

[1] 在實際場景中,即使是 PowerShell模塊中的代碼也會看到具有范圍說明符$global:的全局變量,並且全局變量的隱式可見性始終適用。

對於內存模塊,一種方法可以使$global / -Scope global引用不同的范圍,即模塊自己的頂級范圍,但該技術晦澀難懂,沒有文檔記錄,其實際用途未知.
如果您想了解更多信息,請繼續閱讀。


可選閱讀:創建一個將自己的頂級范圍視為全局范圍的內存模塊:

PetSerAl發現了一種鮮為人知的方法來創建內存模塊,該方法使其將$global: / -Scope global視為自己的頂級范圍而不是真正的全局范圍 - 奇怪的是,使用顯式范圍參考使代碼仍然看到(非陰影)全局變量:

$global:MyVariable = 42 # Create a true global variable.

# Create an in-memory module for which its *own top-level scope*
# becomes the "global" scope, by virtue of passing $false to the
# [psmoduleinfo] constructor:
& ([psmoduleinfo]::new($false)) {
  @"
   "$global:MyVariable",
   "$(Get-Variable -ValueOnly -Scope global MyVariable)",
   "$MyVariable"
"@
}

產量:

Get-Variable : Cannot find a variable with the name 'MyVariable'.
# ...

   "",  # $global:MyVariable didn't find the variable
   ",   # Neither did Get-Variable -Scope Global (see error above)
   "42" # OK - implicit visibility of true global variables

請注意, New-ModuleImport-Module (對於持久化模塊)都沒有提供此功能。

Patrick Meinecke這篇優秀的博客文章中解釋了上面用於在模塊范圍內調用腳本塊的模糊& <module-info> { ... }技術。

運行它,看看最好總是指定,如果你不這樣做,你將不會得到你所期望的

function func {
    "0. $myvar"
    $myvar='funclocal'
    "1. $myvar"
    "2. $Global:myvar"
}
$Global:myvar='global'
func
"3. $Global:myvar"

你不需要使用 $global: 調用時

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM