about_Scopes

Назначение: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

РАЗДЕЛ

about_Scopes

КРАТКОЕ ОПИСАНИЕ

Объясняется понятие области действия в Windows PowerShell® и показывается, как устанавливать и изменять область элементов.

ПОДРОБНОЕ ОПИСАНИЕ

Windows PowerShell защищает доступ к переменным, псевдонимам, функциям и дискам Windows PowerShell (PSDrives), ограничивая область их чтения и изменения. Применением нескольких простых правил для области действия Windows PowerShell обеспечивает защиту от случайного изменения элементов, которые менять не следует.

Ниже перечислены основные правила области.

  • – Любой элемент, включенный в область действия, доступен в области, в которой он был создан, а также в ее дочерних областях, если он явно не сделан закрытым. Переменные, псевдонимы, функции и диски Windows PowerShell можно помещать в одну или в несколько областей.

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

При создании в одной области элемента с таким же именем, как у элемента в другой области, первоначальный элемент может быть скрыт под новым элементом. Однако он не переопределяется и не изменяется.

ОБЛАСТИ WINDOWS POWERSHELL

Области в Windows PowerShell имеют имена и номера. Имена задают абсолютную область. Номера являются относительными и отражают отношения между областями.

  • Глобальная:
    область, действующая при запуске Windows PowerShell. Переменные и функции, присутствующие при запуске Windows PowerShell, созданы в глобальной области. В нее входят автоматические переменные и привилегированные переменные. Кроме того, в нее входят переменные, псевдонимы и функции, входящие в ваши профили Windows PowerShell.
  • Локальная:
    текущая область. Локальной областью может быть глобальная или любая другая область.
  • Сценарий:
    область, создаваемая при запуске файла сценария. В области сценария выполняются только команды сценария. Для команд сценария область сценария является локальной.
  • Закрытая:
    элементы, созданные в закрытой области, недоступны из-за пределов текущей области. Закрытая область позволяет создать закрытую версию элемента с таким же именем в другой области.
  • Нумерованные области:
    на области можно ссылаться по имени или номеру, описывающему расположение областей относительно друг друга. Область 0 — это текущая или локальная область. Область 1 — это ближайшая родительская область текущей области. Область 2 — это родительская область ближайшей родительской области и т. д. Нумерация областей полезна при использовании большого количества рекурсивных областей.

РОДИТЕЛЬСКИЕ И ДОЧЕРНИЕ ОБЛАСТИ

Новую область можно создать, запустив сценарий или функцию, создав сеанс или запустив новый экземпляр Windows PowerShell. При создании области возникают родительская область (первоначальная область) и дочерняя область (созданная область).

Все области Windows PowerShell являются дочерними для глобальной области, однако при этом можно создавать много обычных и рекурсивных областей.

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

НАСЛЕДОВАНИЕ

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

Однако дочерняя область создается со своим набором элементов. Обычно в нее входят все псевдонимы с параметром AllScope. Об этом параметре рассказано далее в данном разделе. В область входят все переменные с параметром AllScope, а также некоторые переменные, которые можно использовать для настройки области, например MaximumFunctionCount.

Для поиска элементов в определенной области нужно использовать параметр Scope командлетов Get-Variable или Get-Alias.

Например, для получения всех переменных в локальной области введите следующую команду:

        get-variable -scope local

Для получения всех переменных в глобальной области введите следующую команду:

        get-variable -scope global

МОДИФИКАТОРЫ ОБЛАСТИ

Чтобы указать область новой переменной, псевдонима или функции, используйте модификатор области. Модификатор может иметь значения Global, Local, Private и Script.

Синтаксис модификатора области в переменной:

        $[<scope-modifier>]:<name> = <value>

Синтаксис модификатора области в функции:

        function [<scope-modifier>]:<name> {<function-body>}

Для сценариев по умолчанию устанавливается область сценария. Для функций и псевдонимов по умолчанию устанавливается локальная область, даже если они определяются в сценарии.

Приведенная ниже команда, не использующая модификатор области, создает переменную в текущей или локальной области.

       $a = "one"

Для создания той же переменной в глобальной области нужно использовать модификатор области Global.

       $global:a = "one"

Для создания той же переменной в области сценария нужно использовать модификатор области script.

       $script:a = "one"

Модификатор области также можно использовать в функциях. Приведенное ниже определение функции создает функцию в глобальной области.

       function global:Hello
       {
    write-host "Hello, World"
       }

Модификаторы области также можно использовать для ссылок на переменные в другой области. Приведенная ниже команда ссылается на переменную $test, сначала в локальной, а затем в глобальной области.

      $test

      $global:test

МОДИФИКАТОР ОБЛАСТИ USING

Using — это специальный модификатор области, который определяет локальную переменную в удаленной команде. По умолчанию предполагается, что переменные в удаленных командах определяются в удаленном сеансе.

Модификатор области Using появился в Windows PowerShell 3.0.

Подробнее см. в разделе about_Remote_Variables.

ПАРАМЕТР ALLSCOPE

Переменные и псевдонимы имеют свойство Option, которое может иметь значение AllScope. Элементы со свойством AllScope становятся частью создаваемых дочерних областей, хотя они не наследуются родительскими областями.

Элементы со свойством AllScope видимы в дочерних областях и являются их частью. Изменения в элементах любой области влияют на все области, в которых определены переменные.

УПРАВЛЕНИЕ ОБЛАСТЬЮ

В некоторых командлетах используется параметр Scope, позволяющий получить или установить (создать и изменить) элементы в определенной области. С помощью следующей команды можно найти все командлеты текущего сеанса с параметром Scope:

         get-help * -parameter scope

Для поиска переменных, видимых в определенной области, нужно использовать параметр Scope командлета Get-Variable. Видимыми являются глобальные параметры, параметры в родительской области и параметры в текущей области. Вставить здесь текст раздела.

Например, следующая команда получает переменные, видимые в локальной области:

        get-variable -scope local

Для создания переменной в определенной области используйте модификатор области или параметр Scope командлета Set-Variable. Следующая команда создает переменную в глобальной области:

        new-variable -scope global -name a -value "One"

Для указания области можно использовать и параметр Scope командлетов New-Alias, Set-Alias или Get-Alias. Следующая команда создает псевдоним в глобальной области:

        new-alias -scope global -name np -value Notepad.exe

Для получения функций в определенной области используйте командлет Get-Item в этой области. У командлета Get-Item нет параметра scope.

ИСПОЛЬЗОВАНИЕ ТОЧЕЧНОЙ НОТАЦИИ ВЫЗОВА С ОБЛАСТЬЮ ДЕЙСТВИЯ

Сценарии и функции подчиняются всем правилам области. При создании в определенной области они влияют только на нее, если не использовать параметр командлета или модификатор области для ее смены.

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

Чтобы добавить функцию в текущую область, введите точку (.) и пробел перед путем и именем функции в вызове функции.

Например, для запуска сценария Sample.ps1 из каталога C:\Scripts в области сценария (используемой по умолчанию для сценариев) используйте следующую команду:

        c:\scripts\sample.ps1

Для запуска сценария Sample.ps1 в локальной области используйте следующую команду:

        . c:\scripts.sample.ps1

При использовании оператора вызова (&) для запуска функции или сценария они не добавляются в текущую область. В примере ниже используется оператор вызова.

        & c:\scripts.sample.ps1

Любые псевдонимы, функции и переменные, создаваемые сценарием Sample.ps1, недоступны в текущей области.

ОГРАНИЧЕНИЕ БЕЗ ОБЛАСТИ

Некоторые концепции Windows PowerShell сходны с областями или взаимодействуют с ними. Эти концепции можно перепутать с областью или с ее поведением.

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

  • Сеансы
    Сеанс — это среда, в которой выполняется Windows PowerShell. При создании сеанса на удаленном компьютере Windows PowerShell открывает постоянное подключение к этому удаленному компьютеру. Постоянное подключение позволяет использовать сеанс для нескольких связанных команд.

    Так как сеанс является вложенной средой, он имеет собственную область, но не является дочерней областью сеанса, в котором был создан. Сеанс открывается с собственной глобальной областью. Эта область не зависит от глобальной области сеанса. В сеансе можно создавать дочерние области. Например, для создания дочерней области в сеансе можно запустить сценарий.

  • Модули
    Модули Windows PowerShell используются для общего использования и передачи средств Windows PowerShell. Модуль — это блок, содержащий командлеты, сценарии, функции, переменные, псевдонимы и другие полезные элементы. Элементы модуля не доступны вне модуля, если иное не указано явно. Поэтому модули можно добавлять в сеанс и использовать содержащиеся в них общие элементы, не беспокоясь о том, что другие элементы могут переопределить командлеты, сценарии, функции и другие элементы текущего сеанса.

    По закрытости модуль напоминает область, но при добавлении модуля в сеанс область действия не изменяется. Кроме того, модули не имеют собственных областей, хотя сценарии в модуле, например все сценарии Windows PowerShell, имеют собственные области.

  • Вложенные командные строки
    Аналогично вложенные командные строки не имеют собственных областей. При вводе вложенная командная строка является подмножеством среды. Однако при этом действительной остается локальная область.

    Сценарии имеют собственные области. При отладке сценария и достижении точки останова сценария действительной становится область сценария.

  • Параметр Private
    Переменные и псевдонимы имеют свойство Option, которое может иметь значение Private. Элементы с параметром Private можно просматривать и изменять в области, в которой они были созданы, но нельзя просматривать и изменять за ее пределами.

    Например, при создании переменной с параметром private в глобальной области и последующем запуске сценария команды Get-Variable в сценарии не будут выводить эту закрытую переменную. Это происходит даже при использовании модификатора глобальной области.

    Параметр Option командлетов New-Variable, Set-Variable, New-Alias и Set-Alias можно использовать для установки значения Private для свойства Option.

  • Видимость.
    Свойство Visibility переменной или псевдонима определяет, видимы ли они вне контейнера (например модуля), в котором были созданы. Свойство Visibility предназначено для контейнеров точно так же, как значение Private свойства Option предназначено для областей.

    Свойство Visibility может иметь значения Public и Private. Элементы с закрытой видимостью можно просматривать и изменять только в контейнере, в котором они были созданы. Если контейнер добавлен или импортирован, элементы с закрытой видимостью нельзя просматривать или изменять.

    Так как свойство Visibility разработано для контейнеров, в области оно функционирует иначе. При создании в глобальной области элемент с закрытой видимостью нельзя просматривать или редактировать ни в одной области. При попытке просмотра или изменения значения переменной с закрытой видимостью Windows PowerShell возвращает сообщение об ошибке.

    Для создания переменной с закрытой видимостью можно использовать командлеты New-Variable и Set-Variable.

ПРИМЕРЫ

Пример 1. Изменение значения переменной только в сценарии

Приведенная ниже команда меняет значение переменной $ConfirmPreference в сценарии. Изменение не влияет на глобальную область.

Сначала для отображения значения переменной $ConfirmPreference в локальной области нужно использовать следующую команду:

          C:\PS> $ConfirmPreference
          High

Создайте сценарий Scope.ps1, который содержит следующие команды:

          $ConfirmPreference = "Low"
          "The value of `$ConfirmPreference is $ConfirmPreference."

Запустите сценарий. Он изменит значение переменной $ConfirmPreference и выведет ее значение в области сценария. Выходные данные должны выглядеть так:

          The value of $ConfirmPreference is Low.

Затем проверьте текущее значение переменной $ConfirmPreference в текущей области.

          C:\PS> $ConfirmPreference
          High

Этот пример показывает, что изменение значения переменной в области сценария не влияет на значение этой переменной в родительской области.

Пример 2. Просмотр значения переменной в других областях

Модификаторы области можно использовать для просмотра значения переменной в локальной области и в родительской области.

Сначала определите переменную $test в глобальной области.

        $test = "Global"

Затем создайте сценарий Sample.ps1, определяющий переменную $test. В сценарии нужно использовать модификатор области для ссылки на глобальную или локальную версии переменной $test. Вставить здесь текст раздела.

          # In Sample.ps1

          $test = "Local"
          "The local value of `$test is $test."
          "The global value of `$test is $global:test."

При запуске сценария Sample.ps1 выходные данные должны выглядеть так:

          The local value of $test is Local.
          The global value of $test is Global.

По завершении сценария в сеансе определено только глобальное значение переменной $test.

          C:\PS> $test
          Global

Пример 3. Изменение значения переменной в родительской области

Если переменная не защищена параметром Private или другим способом, ее значение в родительской области можно просматривать и изменять.

Сначала определите переменную $test в глобальной области.

        $test = "Global"

Затем создайте сценарий Sample.ps1, определяющий переменную $test. В сценарии нужно использовать модификатор области для ссылки на глобальную или локальную версии переменной $test.

          # In Sample.ps1

          $global:test = "Local"
          "The global value of `$test is $global:test."

По завершении сценария изменяется глобальное значение переменной $test.

          C:\PS> $test
          Local

Пример 4. Создание закрытой переменной

Закрытая переменная — это переменная, у которой свойство Option имеет значение Private. Закрытые переменные наследуются дочерней областью, но просматривать и изменять их можно только в области, в которой они были созданы.

Следующая команда создает закрытую переменную $ptest в локальной области:

        New-Variable -Name ptest -Value 1 -Option private

Значение переменной $ptest можно показать и изменить в локальной области.

          C:\PS> $ptest
          1
          C:\PS> $ptest = 2
          C:\PS> $ptest
          2

Затем создайте сценарий Sample.ps1, содержащий приведенные ниже команды. Команда пытается отобразить и изменить значение $ptest.

          # In Sample.ps1

          "The value of `$Ptest is $Ptest."
          "The value of `$Ptest is $global:Ptest."

Так как переменная $ptest невидима в области действия сценария, выходные данные не отображаются.

          "The value of $Ptest is ."
          "The value of $Ptest is ."

Пример 5. Использование локальной переменной в удаленной команде

Чтобы указать, что переменная в удаленной команде была создана в локальном сеансе, используйте модификатор области Using. По умолчанию Windows PowerShell предполагает, что переменные в удаленных командах были созданы в удаленном сеансе.

Синтаксис:

           $Using:<VariableName>

Например, следующие команды создают переменную $Cred в локальном сеансе, а затем используют переменную $Cred в удаленной команде:

           $Cred = Get-Credential
           Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $Using:Cred}

Область Using появилась в Windows PowerShell 3.0.

В Windows PowerShell 2.0, чтобы указать, что переменная была создана в локальном сеансе, используйте следующий формат команды:

           $Cred = Get-Credential
           Invoke-Command $s {param($c) Remove-Item .\Test*.ps1 -Credential $c} -ArgumentList $Cred

СМ. ТАКЖЕ

about_Variables

about_Environment_Variables

about_Functions

about_Script_Blocks