Sobre Âmbitos
Breve descrição
Explica o conceito de âmbito no PowerShell e mostra como definir e alterar o âmbito dos elementos.
Longa descrição
O PowerShell protege o acesso a variáveis, pseudónimos, funções e unidades PowerShell (PSDrives) limitando onde podem ser lidas e alteradas. A PowerShell utiliza regras de âmbito para garantir que não altere inadvertidamente um item que não deve ser alterado.
Seguem-se as regras básicas de âmbito:
As miras podem nidificar. Um âmbito exterior é referido como um âmbito parental. Quaisquer miras aninhadas são miras infantis desse progenitor.
Um item é visível no âmbito em que foi criado e em qualquer âmbito infantil, a menos que o torne explicitamente privado. Pode colocar variáveis, pseudónimos, funções ou unidades PowerShell em um ou mais âmbitos.
Um item que criou dentro de um âmbito só pode ser alterado no âmbito em que foi criado, a menos que especifique explicitamente um âmbito diferente.
Se criar um item num âmbito, e o item partilhar o seu nome com um item num âmbito diferente, o item original pode estar escondido sob o novo item, mas não é ultrapassado ou alterado.
Âmbitos PowerShell
A PowerShell suporta os seguintes âmbitos:
Global: O âmbito que está em vigor quando o PowerShell começa. Variáveis e funções que estão presentes quando o PowerShell começa foram criados no âmbito global, tais como variáveis automáticas e variáveis de preferência. As variáveis, pseudónimos e funções nos seus perfis PowerShell também são criadas no âmbito global.
Local: O âmbito atual. O âmbito local pode ser o âmbito global ou qualquer outro âmbito.
Script: O âmbito que é criado enquanto um ficheiro de script é executado. Apenas os comandos no script são executados no âmbito do script. Para os comandos de um script, o âmbito do script é o âmbito local.
Nota
Privado não é uma mira. É uma opção que altera a visibilidade de um item fora do âmbito onde o item é definido.
Âmbitos dos pais e dos filhos
Pode criar um novo âmbito executando um script ou função, criando uma sessão, ou iniciando uma nova instância do PowerShell. Quando se cria um novo âmbito, o resultado é um âmbito parental (o âmbito original) e um âmbito para criança (o âmbito que criou).
No PowerShell, todos os âmbitos são âmbitos infantis do âmbito global, mas você pode criar muitos âmbitos e muitos âmbitos recursivos.
A menos que torne explicitamente os itens privados, os itens no âmbito dos pais estão disponíveis para o âmbito da criança. No entanto, os itens que cria e altera no âmbito da criança não afetam o âmbito dos pais, a menos que especifique explicitamente o âmbito quando cria os itens.
Herança
Um âmbito infantil não herda as variáveis, pseudónimos e funções do âmbito dos pais. A menos que um item seja privado, o âmbito da criança pode ver os itens no âmbito dos pais. E, pode alterar os itens especificando explicitamente o âmbito dos pais, mas os itens não fazem parte do âmbito da criança.
No entanto, um âmbito infantil é criado com um conjunto de itens. Tipicamente, inclui todos os pseudónimos que têm a opção AllScope. Esta opção é discutida mais tarde neste artigo. Inclui todas as variáveis que têm a opção AllScope, além de algumas variáveis automáticas.
Para encontrar os itens num determinado âmbito, utilize o parâmetro Scope de Get-Variable
ou Get-Alias
.
Por exemplo, para obter todas as variáveis no âmbito local, escreva:
Get-Variable -Scope local
Para obter todas as variáveis no âmbito global, escreva:
Get-Variable -Scope global
Modificadores de âmbito
Uma variável, pseudónimo ou nome de função pode incluir qualquer um dos seguintes modificadores de âmbito opcional:
global:
- Especifica que o nome existe no âmbito Global.local:
- Especifica que o nome existe no âmbito local. O âmbito atual é sempre o âmbito local.private:
- Especifica que o nome é Privado e só é visível ao âmbito atual.script:
- Especifica que o nome existe no âmbito do Script. O âmbito do script é o âmbito do ficheiro de script do ancestral mais próximo ou global se não houver um ficheiro de script ancestral mais próximo.using:
- Usado para aceder a variáveis definidas noutro âmbito enquanto executa scripts através de cmdlets comoStart-Job
eInvoke-Command
.workflow:
- Especifica que o nome existe dentro de um fluxo de trabalho. Nota: Os fluxos de trabalho não são suportados no PowerShell Core.<variable-namespace>
- Um modificador criado por um fornecedor Dedeshell PSDrive. Por exemplo:Espaço de Nomes Description Alias:
Pseudónimos definidos no âmbito atual Env:
Variáveis ambientais definidas no âmbito atual Function:
Funções definidas no âmbito atual Variable:
Variáveis definidas no âmbito atual
O âmbito padrão para scripts é o âmbito do script. O âmbito padrão para funções e pseudónimos é o âmbito local, mesmo que sejam definidos num script.
Utilizando modificadores de âmbito
Para especificar o âmbito de uma nova variável, pseudónimo ou função, utilize um modificador de âmbito.
A sintaxe para um modificador de âmbito numa variável é:
$[<scope-modifier>:]<name> = <value>
A sintaxe para um modificador de âmbito numa função é:
function [<scope-modifier>:]<name> {<function-body>}
O seguinte comando, que não utiliza um modificador de âmbito, cria uma variável no âmbito atual ou local:
$a = "one"
Para criar a mesma variável no âmbito global, utilize o modificador de global:
âmbito:
$global:a = "one"
Para criar a mesma variável no âmbito do script, utilize o script:
modificador de âmbito:
$script:a = "one"
Também pode utilizar um modificador de âmbito com funções. A seguinte definição de função cria uma função no âmbito global:
function global:Hello {
Write-Host "Hello, World"
}
Também pode utilizar modificadores de âmbito para se referir a uma variável num âmbito diferente.
O seguinte comando refere-se à $test
variável, primeiro no âmbito local e depois no âmbito global:
$test
$global:test
O Using:
modificador de âmbito
A utilização é um modificador de âmbito especial que identifica uma variável local num comando remoto. Sem um modificador, o PowerShell espera que as variáveis em comandos remotos sejam definidas na sessão remota.
O modificador de âmbito utilização é introduzido no PowerShell 3.0.
Para mais informações, consulte about_Remote_Variables.
A opção AllScope
Variáveis e pseudónimos têm uma propriedade Option que pode ter um valor de AllScope. Os itens que têm a propriedade AllScope tornam-se parte de quaisquer âmbitos infantis que você cria, embora não sejam reactivamente herdados por âmbitos dos pais.
Um item que tem a propriedade AllScope é visível no âmbito da criança, e faz parte desse âmbito. As alterações ao item em qualquer âmbito afetam todos os âmbitos em que a variável é definida.
Âmbito de Gestão
Vários cmdlets têm um parâmetro de âmbito que permite obter ou definir itens (criar e alterar) itens num determinado âmbito. Utilize o seguinte comando para encontrar todos os cmdlets na sua sessão que tenham um parâmetro De âmbito:
Get-Help * -Parameter scope
Para encontrar as variáveis visíveis num determinado âmbito, utilize o Scope
parâmetro de Get-Variable
. As variáveis visíveis incluem variáveis globais, variáveis no âmbito principal, e variáveis no âmbito atual.
Por exemplo, o seguinte comando obtém as variáveis que são visíveis no âmbito local:
Get-Variable -Scope local
Para criar uma variável num determinado âmbito, utilize um modificador de âmbito ou o parâmetro Scope de Set-Variable
. O seguinte comando cria uma variável no âmbito global:
New-Variable -Scope global -Name a -Value "One"
Também pode utilizar o parâmetro Scope do New-Alias
Set-Alias
, ou Get-Alias
cmdlets para especificar o âmbito. O seguinte comando cria um pseudónimo no âmbito global:
New-Alias -Scope global -Name np -Value Notepad.exe
Para obter as funções num determinado âmbito, utilize o Get-Item
cmdlet quando estiver no âmbito. O Get-Item
cmdlet não tem um parâmetro de Âmbito.
Nota
Para os cmdlets que utilizam o parâmetro Scope, também pode consultar os âmbitos por número. O número descreve a posição relativa de um âmbito para outro. O âmbito 0 representa o âmbito atual, ou local. O âmbito 1 indica o âmbito imediato dos pais. O âmbito 2 indica o progenitor do âmbito dos pais, e assim por diante. Os âmbitos numerados são úteis se tiver criado muitos âmbitos recursivos.
Utilização de notação de ponto de origem com âmbito
Scripts e funções seguem todas as regras de âmbito. Cria-se-as num determinado âmbito, e elas afetam apenas esse âmbito, a menos que utilize um parâmetro cmdlet ou um modificador de âmbito para alterar esse âmbito.
Mas, pode adicionar um script ou função ao âmbito atual utilizando a notação de origem do ponto. Em seguida, quando um script é executado no âmbito atual, quaisquer funções, pseudónimos e variáveis que o script cria estão disponíveis no âmbito atual.
Para adicionar uma função ao âmbito atual, digite um ponto (.) e um espaço antes do caminho e nome da função na chamada de função.
Por exemplo, para executar o Sample.ps1 script a partir do diretório C:\Scripts no âmbito do script (o padrão para scripts), use o seguinte comando:
c:\scripts\sample.ps1
Para executar o Sample.ps1 script no âmbito local, utilize o seguinte comando:
. c:\scripts.sample.ps1
Quando utiliza o operador de chamada (&) para executar uma função ou script, este não é adicionado ao âmbito atual. O seguinte exemplo utiliza o operador de chamadas:
& c:\scripts.sample.ps1
Pode ler mais sobre o operador de chamadas em about_operators.
Quaisquer pseudónimos, funções ou variáveis que o Sample.ps1 script cria não estão disponíveis no âmbito atual.
Restringir sem âmbito
Alguns conceitos PowerShell são semelhantes ao âmbito ou interagem com o âmbito. Estes conceitos podem ser confundidos com âmbito ou comportamento de âmbito.
Sessões, módulos e solicitações aninhadas são ambientes autossuficientes, mas não são âmbitos infantis do âmbito global da sessão.
Sessões
Uma sessão é um ambiente em que o PowerShell funciona. Quando cria uma sessão num computador remoto, o PowerShell estabelece uma ligação persistente ao computador remoto. A ligação persistente permite-lhe utilizar a sessão para vários comandos relacionados.
Porque uma sessão é um ambiente contido, tem o seu próprio âmbito, mas uma sessão não é um âmbito infantil da sessão em que foi criada. A sessão começa com o seu próprio âmbito global. Este âmbito é independente do âmbito global da sessão. Pode criar miras para crianças na sessão. Por exemplo, pode executar um script para criar uma extensão para crianças numa sessão.
Módulos
Pode utilizar um módulo PowerShell para partilhar e fornecer ferramentas PowerShell. Um módulo é uma unidade que pode conter cmdlets, scripts, funções, variáveis, pseudónimos e outros itens úteis. A menos que explicitamente definidos, os itens num módulo não estão acessíveis fora do módulo. Portanto, pode adicionar o módulo à sua sessão e utilizar os itens públicos sem se preocupar que os outros itens possam sobrepor-se aos cmdlets, scripts, funções e outros itens na sua sessão.
A privacidade de um módulo comporta-se como um âmbito, mas adicionar um módulo a uma sessão não altera o âmbito. E, o módulo não tem o seu próprio âmbito, embora os scripts no módulo, como todos os scripts PowerShell, tenham o seu próprio âmbito.
Por predefinição, os módulos são carregados no nível superior da sessão atual, não no _âmbito_atual . Este pode ser um estado de sessão de módulos ou o estado global da sessão. Se você está no âmbito global, então os módulos são carregados no estado global da sessão. Quaisquer exportações são colocadas nas tabelas globais.
Se carregar o módulo2 a partir do módulo1, o módulo2 é carregado no estado de sessão do módulo1, e não no estado global da sessão. Quaisquer exportações do módulo2 são colocadas no topo do estado de sessão do módulo1. Se Import-Module -Scope local
utilizar, as exportações são colocadas no objeto de âmbito atual e não no nível superior. Se estiver num módulo e usar Import-Module -Scope global
Import-Module -Global
(ou) para carregar outro módulo, esse módulo e as suas exportações são carregados para o estado global da sessão em vez do estado de sessão local do módulo. Esta funcionalidade foi concebida para escrever módulos que manipulam módulos. O módulo WindowsCompatibility faz isto para importar módulos de procuração para o âmbito global.
Solicitações Aninhadas
Da mesma forma, as indicações aninhadas não têm o seu próprio âmbito. Quando introduz uma solicitação aninhada, o pedido aninhado é um subconjunto do ambiente. Mas, permaneces dentro do âmbito local.
Os guiões têm o seu próprio alcance. Se estiver a depurar um guião e chegar a um ponto de rutura no script, introduza o âmbito do script.
Opção Privada
Pseudónimos e variáveis têm uma propriedade Option que pode ter um valor de Private. Os itens que têm a opção Private podem ser vistos e alterados no âmbito em que são criados, mas não podem ser vistos ou alterados fora desse âmbito.
Por exemplo, se criar uma variável que tenha uma opção privada no âmbito global e depois executar um script, Get-Variable
os comandos no script não exibem a variável privada. A utilização do modificador de âmbito global neste caso não apresenta a variável privada.
Pode utilizar o parâmetro Opção do New-Variable
Set-Variable
, , e New-Alias
Set-Alias
cmdlets para definir o valor da propriedade Opção para Privado.
Visibilidade
A propriedade de visibilidade de uma variável ou pseudónimo determina se você pode ver o item fora do recipiente, no qual foi criado. Um recipiente pode ser um módulo, um guião ou um encaixe. A visibilidade é projetada para recipientes da mesma forma que o valor privado da propriedade Option é projetado para âmbitos.
O imóvel de Visibilidade leva os valores Público e Privado. Os itens que têm visibilidade privada só podem ser vistos e alterados no recipiente em que foram criados. Se o contentor for adicionado ou importado, os itens que tenham visibilidade privada não podem ser vistos ou alterados.
Como a visibilidade é projetada para recipientes, funciona de forma diferente num âmbito.
- Se criar um item que tenha visibilidade privada no âmbito global, não poderá visualizar ou alterar o item em qualquer âmbito.
- Se tentar visualizar ou alterar o valor de uma variável que tenha visibilidade privada, a PowerShell devolve uma mensagem de erro.
Você pode usar os New-Variable
Set-Variable
cmdlets e para criar uma variável que tem visibilidade privada.
Exemplos
Exemplo 1: Alterar um valor variável apenas num script
O seguinte comando altera o valor da $ConfirmPreference
variável num script. A alteração não afeta o âmbito global.
Primeiro, para mostrar o valor da $ConfirmPreference
variável no âmbito local, utilize o seguinte comando:
PS> $ConfirmPreference
High
Crie um script Scope.ps1 que contenha os seguintes comandos:
$ConfirmPreference = "Low"
"The value of `$ConfirmPreference is $ConfirmPreference."
Execute o script. O script altera o valor da $ConfirmPreference
variável e, em seguida, reporta o seu valor no âmbito do script. A saída deve assemelhar-se à seguinte saída:
The value of $ConfirmPreference is Low.
Em seguida, teste o valor atual da $ConfirmPreference
variável no âmbito atual.
PS> $ConfirmPreference
High
Este exemplo mostra que as alterações ao valor de uma variável no âmbito do script não afetam o valor da variável no âmbito dos pais.
Exemplo 2: Ver um Valor Variável em Diferentes Âmbitos
Pode utilizar modificadores de âmbito para visualizar o valor de uma variável no âmbito local e no âmbito dos pais.
Primeiro, definir uma $test
variável no âmbito global.
$test = "Global"
Em seguida, crie um script Sample.ps1 que define a $test
variável. No script, utilize um modificador de âmbito para se referir às versões globais ou locais da $test
variável.
Em Sample.ps1:
$test = "Local"
"The local value of `$test is $test."
"The global value of `$test is $global:test."
Quando se corre Sample.ps1, a saída deve assemelhar-se à seguinte saída:
The local value of $test is Local.
The global value of $test is Global.
Quando o script estiver completo, apenas o valor global $test
é definido na sessão.
PS> $test
Global
Exemplo 3: Alterar o valor de uma variável num âmbito parental
A menos que proteja um item utilizando a opção Private ou outro método, pode ver e alterar o valor de uma variável num âmbito parental.
Primeiro, definir uma $test
variável no âmbito global.
$test = "Global"
Em seguida, crie um script Sample.ps1 que define a $test
variável. No script, utilize um modificador de âmbito para se referir às versões globais ou locais da $test
variável.
Em Sample.ps1:
$global:test = "Local"
"The global value of `$test is $global:test."
Quando o guião está completo, o valor global $test
é alterado.
PS> $test
Local
Exemplo 4: Criação de uma variável privada
Uma variável privada é uma variável que tem uma propriedade Opção que tem um valor de Private. As variáveis privadas são herdadas pelo âmbito da criança, mas só podem ser vistas ou alteradas no âmbito em que foram criadas.
O seguinte comando cria uma variável privada chamada $ptest
no âmbito local.
New-Variable -Name ptest -Value 1 -Option private
Pode exibir e alterar o valor do $ptest
âmbito local.
PS> $ptest
1
PS> $ptest = 2
PS> $ptest
2
Em seguida, crie um script Sample.ps1 que contenha os seguintes comandos. O comando tenta visualizar e alterar o valor de $ptest
.
Em Sample.ps1:
"The value of `$Ptest is $Ptest."
"The value of `$Ptest is $global:Ptest."
A $ptest
variável não é visível no âmbito do script, a saída está vazia.
"The value of $Ptest is ."
"The value of $Ptest is ."
Exemplo 5: Utilização de uma variável local num comando remoto
Para variáveis num comando remoto criado na sessão local, utilize o Using
modificador de âmbito. PowerShell assume que as variáveis em comandos remotos foram criadas na sessão remota.
A sintaxe é:
$Using:<VariableName>
Por exemplo, os seguintes comandos criam uma $Cred
variável na sessão local e, em seguida, usam a $Cred
variável num comando remoto:
$Cred = Get-Credential
Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $Using:Cred}
O âmbito de utilização foi introduzido no PowerShell 3.0. No PowerShell 2.0, para indicar que uma variável foi criada na sessão local, utilize o seguinte formato de comando.
$Cred = Get-Credential
Invoke-Command $s {
param($c)
Remove-Item .\Test*.ps1 -Credential $c
} -ArgumentList $Cred