Необязательно ли использовать префикс $ global: scope при обращении к глобальной переменной? - PullRequest
0 голосов
/ 23 января 2019

Если я объявляю и инициализирую переменную PowerShell с $global:MyVariable = "123", нужно ли мне использовать $ global: везде, где я использую переменную, или я могу просто использовать $ MyVariable?

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Запустите это и убедитесь, что лучше всегда указывать, в противном случае вы не всегда получите то, что ожидаете

function func {
    "0. $myvar"
    $myvar='funclocal'
    "1. $myvar"
    "2. $Global:myvar"
}
$Global:myvar='global'
func
"3. $Global:myvar"
0 голосов
/ 23 января 2019
  • В принципе вы можете использовать только $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> { ... } техника, использованная выше для вызова блока скрипта в области видимости модуля, объяснена в этом превосходном сообщении в блоге Патриком Майнеке .

0 голосов
/ 23 января 2019

вам не нужно использовать $ global: при звонке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...