Сведения об областях
Краткое описание
Объясняет концепцию Scope в PowerShell и показывает, как устанавливать и изменять область элементов.
Подробное описание
PowerShell защищает доступ к переменным, псевдонимам, функциям и дискам PowerShell (Псдривес), ограничивая место для чтения и изменения. PowerShell использует правила области, чтобы предотвратить случайное изменение элемента, который не должен изменяться.
Ниже приведены основные правила области.
Области могут быть вложенными. Внешняя область называется родительской областью. Все вложенные области являются дочерними областями этого родителя.
Элемент отображается в области, в которой он был создан, и во всех дочерних областях, если вы явно не сделаете его частным. Вы можете разместить переменные, псевдонимы, функции или диски PowerShell в одной или нескольких областях.
Элемент, созданный в области, может быть изменен только в той области, в которой она была создана, если только вы явно не указали другую область.
При создании элемента в области и его имени вместе с элементом в другой области исходный элемент может быть скрыт под новым элементом, но не переопределен или не изменен.
Области PowerShell
PowerShell поддерживает следующие области:
Global — область, действующая при запуске PowerShell. Переменные и функции, которые имеются при запуске PowerShell в глобальной области, такие как автоматические переменные и привилегированные переменные. Переменные, псевдонимы и функции в профилях PowerShell также создаются в глобальной области.
Local: текущая область. Локальная область может быть глобальной или любой другой областью.
Скрипт: область, созданная во время выполнения файла скрипта. В области скрипта выполняются только команды в скрипте. Для команд в скрипте областью скрипта является локальная область.
Примечание
Частный не является областью. Это параметр , который изменяет видимость элемента за пределами области, в которой определен элемент.
Родительские и дочерние области
Новую область можно создать, выполнив скрипт или функцию, создав сеанс или запустив новый экземпляр PowerShell. При создании новой области результатом является родительская область (исходная область) и дочерняя область (созданная область).
В PowerShell все области являются дочерними областями глобальной области, но можно создать множество областей и много рекурсивных областей.
Если явно не сделать элементы закрытыми, элементы в родительской области становятся доступными для дочерней области. Однако элементы, создаваемые и изменяемые в дочерней области, не влияют на родительскую область, если только при создании элементов не будет явно задана область.
Наследование
Дочерняя область не наследует переменные, псевдонимы и функции из родительской области. Если элемент не является частным, дочерняя область может просматривать элементы в родительской области. Кроме того, он может изменить элементы, явно указав родительскую область, но элементы не являются частью дочерней области.
Однако дочерняя область создается с набором элементов. Как правило, он включает все псевдонимы с параметром AllScope . Этот параметр обсуждается далее в этой статье. Он включает все переменные с параметром AllScope , а также некоторые автоматические переменные.
Чтобы найти элементы в определенной области, используйте параметр Scope в Get-Variable
или Get-Alias
.
Например, чтобы получить все переменные в локальной области, введите:
Get-Variable -Scope local
Чтобы получить все переменные в глобальной области, введите:
Get-Variable -Scope global
Модификаторы области
Имя переменной, псевдонима или функции может содержать один из следующих необязательных модификаторов области:
global:
— Указывает, что имя существует в глобальной области.local:
— Указывает, что имя существует в локальной области. Текущая область всегда является локальной .private:
— Указывает, что имя является частным и видимым только для текущей области.script:
— Указывает, что имя существует в области скрипта . Область скрипта является ближайшим областью файла скрипта-предка или глобальным , если не существует ближайшего файла скрипта-предка.using:
— Используется для доступа к переменным, определенным в другой области, при выполнении скриптов с помощью таких командлетовStart-Job
, как иInvoke-Command
.workflow:
— Указывает, что имя существует в рабочем процессе. Примечание. рабочие процессы не поддерживаются в PowerShell Core.<variable-namespace>
— Модификатор, созданный поставщиком PSDrive PowerShell. Пример:Пространство имен Описание Alias:
Псевдонимы, определенные в текущей области Env:
Переменные среды, определенные в текущей области Function:
Функции, определенные в текущей области Variable:
Переменные, определенные в текущей области
По умолчанию для скриптов используется область скрипта. Областью действия по умолчанию для функций и псевдонимов является локальная область, даже если они определены в скрипте.
Использование модификаторов области
Чтобы указать область новой переменной, псевдонима или функции, используйте модификатор области.
Синтаксис модификатора области в переменной:
$[<scope-modifier>:]<name> = <value>
Синтаксис модификатора области в функции:
function [<scope-modifier>:]<name> {<function-body>}
Следующая команда, не использующая модификатор области, создает переменную в текущей или локальной области:
$a = "one"
Чтобы создать ту же переменную в глобальной области, используйте модификатор scope global:
:
$global:a = "one"
Чтобы создать ту же переменную в области скрипта , используйте script:
Модификатор scope:
$script:a = "one"
Кроме того, можно использовать модификатор области с функциями. Следующее определение функции создает функцию в глобальной области видимости:
function global:Hello {
Write-Host "Hello, World"
}
Кроме того, можно использовать модификаторы области для ссылки на переменную в другой области.
Следующая команда ссылается на $test
переменную, сначала в локальной области, а затем в глобальной области:
$test
$global:test
Using:
Модификатор области видимости
Использование — это специальный модификатор области, который определяет локальную переменную в удаленной команде. Без модификатора PowerShell требует, чтобы переменные в удаленных командах были определены в удаленном сеансе.
Модификатор области using появился в PowerShell 3,0.
Дополнительные сведения см. в разделе about_Remote_Variables.
Параметр AllScope
Переменные и псевдонимы имеют свойство Option , которое может принимать значение AllScope. Элементы, имеющие свойство AllScope , становятся частью любых создаваемых дочерних областей, хотя они не задним числом наследуются родительскими областями.
Элемент, имеющий свойство AllScope , отображается в дочерней области и является частью этой области. Изменения элемента в любой области влияют на все области, в которых определена переменная.
Управление областью
Несколько командлетов имеют параметр области , который позволяет получать или задавать (создавать и изменять) элементы в определенной области. Используйте следующую команду, чтобы найти все командлеты в сеансе с параметром области :
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
Командлет не имеет параметра области .
Примечание
Для командлетов, использующих параметр области , можно также ссылаться на области по числу. Число описывает относительное расположение одной области в другую. Область 0 представляет текущую или локальную область. Область 1 указывает непосредственную родительскую область. Область 2 указывает родителя родительской области и т. д. Пронумерованные области полезны, если создано много рекурсивных областей.
Использование нотации источника точки с областью видимости
Сценарии и функции соответствуют всем правилам области. Они создаются в определенной области и влияют только на эту область, если только не используется параметр командлета или модификатор области для изменения этой области.
Однако можно добавить скрипт или функцию в текущую область с помощью точечной нотации источника. Затем, когда сценарий выполняется в текущей области, все функции, псевдонимы и переменные, создаваемые сценарием, доступны в текущей области.
Чтобы добавить функцию в текущую область, введите точку (.) и пробел перед путем и именем функции в вызове функции.
Например, чтобы запустить скрипт Sample.ps1 из каталога C:\Scripts в области скрипта (по умолчанию для сценариев), используйте следующую команду:
c:\scripts\sample.ps1
Чтобы запустить скрипт Sample.ps1 в локальной области, используйте следующую команду:
. c:\scripts.sample.ps1
При использовании оператора Call (&) для выполнения функции или скрипта он не добавляется в текущую область. В следующем примере используется оператор Call:
& c:\scripts.sample.ps1
Дополнительные сведения о операторе Call можно узнать в about_operators.
Любые псевдонимы, функции или переменные, создаваемые сценарием Sample.ps1, недоступны в текущей области.
Ограничение без области
Несколько концепций PowerShell похожи на область или взаимодействуют с областью действия. Эти понятия можно путать с областью действия или поведением области.
Сеансы, модули и вложенные запросы являются автономными средами, но они не являются дочерними областями глобальной области в сеансе.
сеансы;
Сеанс — это среда, в которой выполняется PowerShell. При создании сеанса на удаленном компьютере PowerShell устанавливает постоянное подключение к удаленному компьютеру. Постоянное подключение позволяет использовать сеанс для нескольких связанных команд.
Поскольку сеанс является автономной средой, он имеет собственную область, но сеанс не является дочерней областью сеанса, в котором он был создан. Сеанс начинается с собственной глобальной области. Эта область не зависит от глобальной области действия сеанса. В сеансе можно создать дочерние области. Например, можно выполнить сценарий для создания дочерней области в сеансе.
Модули
Вы можете использовать модуль PowerShell для совместного использования и доставки средств PowerShell. Модуль — это единица, которая может содержать командлеты, скрипты, функции, переменные, псевдонимы и другие полезные элементы. Если явно не определено, элементы в модуле недоступны за пределами модуля. Таким образом, можно добавить модуль в сеанс и использовать открытые элементы, не заботясь о том, что другие элементы могут переопределять командлеты, сценарии, функции и другие элементы в сеансе.
Конфиденциальность модуля ведет себя как область, но добавление модуля в сеанс не приводит к изменению области. И модуль не имеет собственной области, хотя скрипты в модуле, такие как все сценарии PowerShell, имеют собственную область.
По умолчанию модули загружаются в верхний уровень текущего состояния сеанса , а не в текущую область. Это может быть состояние сеанса модуля или глобальное состояние сеанса. Если вы используете глобальную область, модули загружаются в глобальное состояние сеанса. Все операции экспорта помещаются в глобальные таблицы.
При загрузке Module2 из Module1 Module2 загружается в состояние сеанса module1's, а не в глобальное состояние сеанса. Все операции экспорта из Module2 помещаются в начало состояния сеанса module1's. Если используется Import-Module -Scope local
, то экспорты помещаются в текущий объект области, а не на верхний уровень. Если вы используете модуль и используете Import-Module -Scope global
(или Import-Module -Global
) для загрузки другого модуля, этот модуль и его экспорты загружаются в глобальное состояние сеанса, а не в локальное состояние сеанса модуля. Эта функция предназначена для написания модуля, который управляет модулями. Модуль Виндовскомпатибилити выполняет это для импорта прокси-модулей в глобальную область.
Вложенные запросы
Аналогично, вложенные запросы не имеют собственной области. При вводе вложенного запроса вложенный запрос является подмножеством среды. Но остается в локальной области.
Скрипты имеют собственную область действия. При отладке скрипта и достижении точки останова в скрипте необходимо ввести область скрипта.
Частный вариант
Псевдонимы и переменные имеют свойство Option , которое может принимать значение Private. Элементы с закрытым параметром можно просматривать и изменять в области, в которой они создаются, но их нельзя просматривать или изменять вне этой области.
Например, если вы создаете переменную с частным параметром в глобальной области, а затем выполняете сценарий, Get-Variable
команды в скрипте не отображают закрытую переменную. Использование модификатора глобальной области в этом экземпляре не приводит к отображению закрытой переменной.
Можно использовать параметр Option New-Variable
Set-Variable
New-Alias
командлетов,,, и, Set-Alias
чтобы задать для свойства параметра значение Private.
Видимость
Свойство видимости переменной или псевдонима определяет, можно ли видеть элемент за пределами контейнера, в котором он был создан. Контейнером может быть модуль, сценарий или оснастка. Видимость предназначена для контейнеров так же, как и закрытое значение свойства Option для областей.
Свойство Visibility принимает открытые и закрытые значения. Элементы, имеющие закрытую видимость, можно просматривать и изменять только в контейнере, в котором они были созданы. Если контейнер добавлен или импортирован, элементы, имеющие закрытую видимость, не могут быть просмотрены или изменены.
Поскольку видимость предназначена для контейнеров, она работает по-разному в области.
- При создании элемента с закрытой видимостью в глобальной области нельзя просматривать или изменять элемент в какой бы то ни было области.
- При попытке просмотра или изменения значения переменной, имеющей закрытую видимость, PowerShell возвращает сообщение об ошибке.
New-Variable
Set-Variable
Для создания переменной с закрытой видимостью можно использовать командлеты и.
Примеры
Пример 1. изменение значения переменной только в скрипте
Следующая команда изменяет значение $ConfirmPreference
переменной в скрипте. Изменение не влияет на глобальную область.
Сначала для вывода значения $ConfirmPreference
переменной в локальной области используйте следующую команду:
PS> $ConfirmPreference
High
Создайте скрипт Scope.ps1, который содержит следующие команды:
$ConfirmPreference = "Low"
"The value of `$ConfirmPreference is $ConfirmPreference."
Выполните скрипт. Скрипт изменяет значение $ConfirmPreference
переменной, а затем сообщает свое значение в области скрипта. Выходные данные должны выглядеть следующим образом:
The value of $ConfirmPreference is Low.
Затем проверьте текущее значение $ConfirmPreference
переменной в текущей области.
PS> $ConfirmPreference
High
В этом примере показано, что изменения значения переменной в области скрипта не влияют на значение переменной в родительской области.
Пример 2. Просмотр значения переменной в разных областях
Модификаторы области можно использовать для просмотра значения переменной в локальной области и в родительской области.
Сначала определите $test
переменную в глобальной области.
$test = "Global"
Затем создайте скрипт Sample.ps1, определяющий $test
переменную. В скрипте используйте модификатор области для ссылки на глобальную или локальную версию $test
переменной.
В 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
в сеансе определяется только глобальное значение.
PS> $test
Global
Пример 3. изменение значения переменной в родительской области
Если вы не защищаете элемент с помощью параметра private или другого метода, то можете просмотреть и изменить значение переменной в родительской области.
Сначала определите $test
переменную в глобальной области.
$test = "Global"
Затем создайте скрипт Sample.ps1, определяющий $test
переменную. В скрипте используйте модификатор области для ссылки на глобальную или локальную версию $test
переменной.
В Sample.ps1:
$global:test = "Local"
"The global value of `$test is $global:test."
По завершении скрипта изменяется глобальное значение $test
.
PS> $test
Local
Пример 4. Создание закрытой переменной
Частная переменная — это переменная, которая имеет свойство Option со значением Private. Закрытые переменные наследуются дочерней областью, но их можно просматривать или изменять только в области, в которой они были созданы.
Следующая команда создает закрытую переменную с именем $ptest
в локальной области.
New-Variable -Name ptest -Value 1 -Option private
Можно отобразить и изменить значение $ptest
в локальной области.
PS> $ptest
1
PS> $ptest = 2
PS> $ptest
2
Затем создайте скрипт Sample.ps1, содержащий следующие команды. Команда пытается отобразить и изменить значение $ptest
.
В 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
Модификатор области. В PowerShell предполагается, что переменные в удаленных командах были созданы в удаленном сеансе.
Синтаксис:
$Using:<VariableName>
Например, следующие команды создают $Cred
переменную в локальном сеансе, а затем используют эту $Cred
переменную в удаленной команде:
$Cred = Get-Credential
Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $Using:Cred}
Область использования была введена в PowerShell 3,0. В PowerShell 2,0, чтобы указать, что переменная была создана в локальном сеансе, используйте следующий формат команды.
$Cred = Get-Credential
Invoke-Command $s {
param($c)
Remove-Item .\Test*.ps1 -Credential $c
} -ArgumentList $Cred