В принципе вы можете использовать только $MyVariable
для ссылки на значение глобальной переменной по этому имени, но вы можете увидетьзначение другой переменной , ситуативно.
В частности, если какая-либо промежуточная наследственная (родительская) область действия или даже , то сама область вызова имеет также создал переменную $MyVariable
(которая обычно неявно проста assigmnent ; например, $MyVariable = ...
), вы увидите , что значение переменной вместо.
Вы только гарантируете , чтобы увидеть глобальное значение, если вы используете спецификатор глобальной области видимости, а именно: $global:MyVariable
(или Get-Variable -ValueOnly -Scope Global MyVariable
) [1]
По умолчанию переменные видимы , но не напрямую модифицируются во всех потомках(детские) прицелы.
- Поэтому вы должны использовать
$global:MyVariable
/ Set-Variable -Scope Global
, чтобы изменить (установить) глобальную переменную;без $global:
вы неявно создадите локальную переменную с тем же именем. - Подробнее о правилах определения области действия PowerShell см. в последнем разделе этот ответ .
[1] В реальных сценариях даже код в PowerShell modules видит глобальные переменные с указателем области действия $global:
иприменяется неявная видимость глобальных переменных всегда .
Для модулей в памяти есть способ заставить $global
/ -Scope global
обратиться к другая область действия , а именно собственная область верхнего уровня модуля, но метод неясен, не задокументирован, а его реальная полезность неизвестна.
Продолжайте читать, если хотите узнать больше.
Необязательное чтение : Создание модуля в памяти, который рассматривает свою собственную область верхнего уровня в качестве глобальной области:
PetSerAl обнаружилмалоизвестный способ создания модуля в памяти таким образом, чтобы он видел $global:
/ -Scope global
какts собственная область верхнего уровня , а не истинная глобальная область - любопытно, что не , использующий явную ссылку на область действия, заставляет код по-прежнему видеть (не затененные) глобальные переменные:
$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-Module
, ни Import-Module
(для постоянных модулей) не предоставляют эту функциональность.
Непонятный & <module-info> { ... }
техника, использованная выше для вызова блока скрипта в области видимости модуля, объяснена в этом превосходном сообщении в блоге Патриком Майнеке .