Следующий скрипт powershell выведет A, B, A

$x = "A"

function scopetest()
{
    Write-Host $x;
    $x = 'B'
    Write-Host $x
}

scopetest

Write-Host $x

Теперь странная часть:

Первое значение A из глобальной области видимости - его можно прочитать внутри функции, поэтому очевидно, что переменная присутствует. Однако, если я пишу в переменную как есть, значение B не сохраняется вне функции.

Я ожидал бы один из этих двух результатов: [null], B, A или A, B, B (последний достигается, если я пишу с использованием $ global: x = 'B').

Почему глобальная переменная $ x доступна для чтения внутри функции, но не для записи?

1 ответ1

2

С https://technet.microsoft.com/en-us/library/hh847849.aspx

Элемент, который вы создали в области действия, можно изменить только в той области, в которой он был создан, если вы явно не укажете другую область.

так что вы можете использовать $Global:x = ... чтобы установить его.

Сценарии Powershell часто копируются и вставляются в блоки для реализации функциональности, и часто методы пишутся для использования несколькими сценариями. Ограничивая присвоение определяющей области действия для переменной, вы гарантируете, что даже если два вставленных блока кода используют одно и то же имя переменной, они не смогут неправильно изменить данные, от которых зависит другой блок, без явного указания, что они хотят это сделать. Это помогает сделать блоки более модульными и помогает выявить непреднамеренные конфликты имен.

Редактировать:

примечание о области действия powershell: Powershell каскадирует области, поэтому локальная область всегда содержит объекты, определенные в областях предков (parent, grantparent, global и т. д.). Это означает, что переменная, определенная глобально или в рамке родительского стека (функция, вызывающая функцию), всегда доступна, тогда как объекты, определенные в дочерних областях, не доступны. В этом случае единственным ограничением является то, что дочерняя область не может изменять значение родительской области, если эта область не определена явно.

От: https://technet.microsoft.com/en-us/library/hh847849.aspx

Ниже приведены основные правила области видимости:

    - An item you include in a scope is visible in the scope in which it 
      was created and in any child scope, unless you explicitly make it 
      private. You can place variables, aliases, functions, or Windows
      PowerShell drives in one or more scopes. 

    - An item that you created within a scope can be changed only in the 
      scope in which it was created, unless you explicitly specify a 
      different scope.


If you create an item in a scope, and the item shares its name with an
item in a different scope, the original item might be hidden under the
new item. But, it is not overridden or changed.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .