Partilhar via


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 como Start-Job e Invoke-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

Ver também

about_Variables

about_Environment_Variables

about_Functions

about_Script_Blocks