Поделиться через


about_Scopes

РАЗДЕЛ
    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 или Script.


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

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


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

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


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

       $a = "один" 

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

       $global:a = "один" 


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

       $script:a = "один" 


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

       function global:Hello
       {
        write-host "Всем привет!"
       }


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

      $test
    
      $global:test


 Параметр 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 "Один"


    Для указания области можно использовать и параметр 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"
          "Значение `$ConfirmPreference равно $ConfirmPreference." 

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

          Значение $ConfirmPreference равно Low.

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

          C:\PS> $ConfirmPreference
          High

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


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


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

      $test = "Глобальная"

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


          # In Sample.ps1

          $test = "Локальная"
          "Локальное значение `$test равно $test." "Глобальное 
          значение `$test равно $global:test." 
    
      При запуске скрипта Sample.ps1 выходные данные должны выглядеть 
      следующим образом.
         
          Локальное значение `$test равно Локальная.
          Глобальное значение `$test равно Глобальная.


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

          C:\PS> $test
          Global


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

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


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

      $test = "Глобальная"


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

          # In Sample.ps1

          $global:test = "Локальная"
          "Глобальное значение `$test равно $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

          "Значение `$Ptest равно $Ptest."
          "Значение `$Ptest равно $global:Ptest."

    
      Поскольку переменная $ptest невидима в области действия 
      скрипта, выходные данные не отображаются.
    
          "Значение $Ptest равно ."
          "Значение $Ptest равно ."
        
   
СМ. ТАКЖЕ
    about_Variables
    about_Environment_Variables
    about_Functions
    about_Script_Blocks