about_Scopes

Aplica-se a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

TÓPICO

about_Scopes

DESCRIÇÃO BREVE

Explica o conceito de escopo em Windows PowerShell® e mostra como configurar e alterar o escopo dos elementos.

DESCRIÇÃO LONGA

O Windows PowerShell protege o acesso a variáveis, aliases, funções e unidades Windows PowerShell (PSDrives), limitando onde elas podem ser lidas e alteradas. Ao aplicar algumas regras simples para o escopo, o Windows PowerShell ajuda a garantir que você não altere acidentalmente um item que não deve ser alterado.

Estas são as regras básicas do escopo:

  • - Um item que você incluir em um escopo está visível no escopo no qual ele foi criado e em qualquer escopo filho, a menos que você explicitamente torne-o particular. Você pode colocar variáveis, aliases, funções ou unidades Windows PowerShell em um ou mais escopos.

  • - Um item que você criou em um escopo pode ser alterado somente no escopo no qual ele foi criado, a menos que você especifique explicitamente um escopo diferente.

Se você criar um item em um escopo e o item compartilhar seu nome com um item em um escopo diferente, o item original pode estar oculto sob o novo item. Mas ele não é substituído ou alterado.

ESCOPOS DO WINDOWS POWERSHELL

Escopos em Windows PowerShell têm nomes e números. Os escopos nomeados especificam um escopo absoluto. Os números são relativos e refletem a relação entre escopos.

  • Global:
    O escopo está em vigor quando Windows PowerShell é iniciado. Variáveis e funções que estão presentes quando o Windows PowerShell inicia foram criadas no escopo global. Isso inclui as variáveis automáticas e variáveis de preferências. Isso também inclui as variáveis, aliases e funções que estão em seus perfis Windows PowerShell.
  • Local:
    O escopo atual. O escopo local pode ser o escopo global ou qualquer outro escopo.
  • Script:
    O escopo é criado durante a execução de um arquivo de script. Somente os comandos no script são executados no escopo do script. Para os comandos em um script, o escopo do script é o escopo local.
  • Particular:
    Os itens no escopo particular não podem ser vistos fora do escopo atual. Você pode usar o escopo particular para criar uma versão particular de um item com o mesmo nome em outro escopo.
  • Escopos Numerados:
    Você pode se referir aos escopos por nome ou por um número que descreva a posição relativa de um escopo para outro. O escopo 0 representa o escopo atual ou local. O escopo 1 indica o escopo pai imediato. O escopo 2 indica o pai do escopo pai e assim por diante. Escopos numerados são úteis se você tiver criado vários escopos recursivos.

ESCOPOS PAI E FILHO

Você pode criar um novo escopo executando um script ou uma função, criando uma sessão ou iniciando uma nova instância do Windows PowerShell. Quando você cria um novo escopo, o resultado é um escopo pai (o escopo original) e um escopo filho (o escopo que você criou).

No Windows PowerShell, todos os escopos são escopos filho do escopo global, mas você pode criar vários escopos e vários escopos recursivos.

A menos que você explicitamente torne os itens particulares, os itens no escopo pai estão disponíveis para o escopo filho. No entanto, os itens que você criar e alterar no escopo filho não afetam o escopo pai, a menos que você especificar explicitamente o escopo ao criar os itens.

HERANÇA

Um escopo filho não herda as variáveis, aliases e funções do escopo pai. A menos que um item seja particular, o escopo filho pode exibir os itens no escopo pai. E ele pode alterar os itens especificando explicitamente o escopo pai, mas os itens não fazem parte do escopo filho.

No entanto, um escopo filho é criado com um conjunto de itens. Normalmente, ele inclui todos os aliases que tem a opção AllScope. Esta opção é abordada posteriormente neste tópico. Ela inclui todas as variáveis que tem a opção AllScope, além de algumas variáveis que podem ser usadas para personalizar o escopo, como MaximumFunctionCount.

Para localizar os itens em um escopo específico, use o parâmetro de escopo de Get-Variable ou Get-Alias.

Por exemplo, para obter todas as variáveis no escopo local, digite:

        get-variable -scope local

Para obter todas as variáveis no escopo global, digite:

        get-variable -scope global

MODIFICADORES DE ESCOPO

Para especificar o escopo de uma nova variável, um alias ou uma função, use um modificador de escopo. Os valores válidos de um modificador são Global, Local, Particular e Script.

A sintaxe para um modificador de escopo em uma variável é:

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

A sintaxe de um modificador de escopo em uma variável é:

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

O escopo padrão de scripts é o escopo do script. O escopo padrão de funções e aliases é o escopo local, mesmo se elas estiverem definidas em um script.

O comando a seguir, que não usa um modificador de escopo, cria uma variável no escopo atual ou local:

       $a = "one"

Para criar a mesma variável no escopo global, use o modificador de escopo Global:

       $global:a = "one"

Para criar a mesma variável no escopo do script, use o modificador de escopo script:

       $script:a = "one"

Você também pode usar um modificador de escopo em funções. A definição de função a seguir cria uma função no escopo global:

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

Você também pode usar os modificadores de escopo para se referir a uma variável em um escopo diferente. O comando a seguir refere-se a variável $test, primeiro no escopo local e, em seguida, no escopo global:

      $test

      $global:test

O MODIFICADOR DE ESCOPO USANDO

Usando é um modificador de escopo especial que identifica uma variável local em um comando remoto. Por padrão, variáveis em comandos remotos devem ser definidos na sessão remota.

O modificador de escopo Usando foi apresentado no Windows PowerShell 3.0.

Para obter mais informações, consulte about_Remote_Variables.

A OPÇÃO ALLSCOPE

Variáveis e aliases têm uma propriedade Opção que pode ter um valor de AllScope. Itens que têm a propriedade AllScope se tornam parte de todos os escopos filho criados, embora eles não sejam herdados por escopos pai retroativamente.

Um item que tem a propriedade AllScope está visível no escopo filho e faz parte do escopo. As alterações ao item em qualquer escopo afetam todos os escopos no qual a variável está definida.

GERENCIANDO O ESCOPO

Vários cmdlets têm um parâmetro de escopo que permite que você obtenha ou configure (criar e alterar) itens em um escopo específico. Use o comando a seguir para localizar todos os cmdlets na sua sessão com um parâmetro de escopo:

         get-help * -parameter scope

Para localizar as variáveis que são visíveis em um escopo específico, use o parâmetro de escopo de Get-Variable. Os parâmetros visíveis incluem parâmetros globais, parâmetros no escopo pai e parâmetros no escopo atual. Insira o corpo da seção aqui.

Por exemplo, o comando a seguir obtém as variáveis que são visíveis no escopo local:

        get-variable -scope local

Para criar uma variável em um escopo específico, use um modificador de escopo ou o parâmetro de escopo de Set-Variable. O comando a seguir cria uma variável no escopo global:

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

Você também pode usar o parâmetro de escopo nos cmdlets New-Alias, Set-Alias ou Get-Alias para especificar o escopo. O comando a seguir cria um alias no escopo global:

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

Para obter as funções em um escopo específico, use o cmdlet Get-Item quando você estiver no escopo. O cmdlet Get-Item não tem um parâmetro de escopo.

USANDO A NOTAÇÃO DE ORIGEM DO PONTO COM ESCOPO

Scripts e funções seguem todas as regras de escopo. Você os cria em um escopo específico e eles afetam somente esse escopo, a menos que você use um parâmetro de cmdlet ou um modificador de escopo para alterar o escopo.

Mas, você pode adicionar um script ou uma função ao escopo atual usando notação de origem do ponto. Em seguida, quando um script é executado no escopo atual, quaisquer funções, aliases e variáveis que o script cria estão disponíveis no escopo atual.

Para adicionar uma função ao escopo atual, digite um ponto (.) e um espaço antes do caminho e o nome da função na chamada de função.

Por exemplo, para executar o script Sample.ps1 do diretório C:\Scripts no escopo do script (o padrão para scripts), use o seguinte comando:

        c:\scripts\sample.ps1

Para executar o script Sample.ps1 no escopo local, use o seguinte comando:

        . c:\scripts.sample.ps1

Quando você usa o operador de chamada (&) para executar uma função ou script, ele não é adicionado ao escopo atual. O exemplo a seguir usa o operador de chamada:

        & c:\scripts.sample.ps1

Quaisquer aliases, funções ou variáveis que o script Sample.ps1 cria não estão disponíveis no escopo atual.

RESTRINGINDO SEM ESCOPO

Alguns conceitos de Windows PowerShell são semelhantes ao escopo ou interagem com escopo. Esses conceitos podem ser confundidos com o escopo ou o comportamento de escopo.

Sessões, módulos e prompts aninhados são ambientes independentes, mas não são escopos filho do escopo global na sessão.

  • Sessões:
    Uma sessão é um ambiente no qual Windows PowerShell é executado. Quando você cria uma sessão em um computador remoto, o Windows PowerShell estabelece uma conexão persistente para o computador remoto. A conexão persistente permite o uso da sessão para vários comandos relacionados.

    Como uma sessão é um ambiente controlado, ela tem seu próprio escopo, mas uma sessão não é um escopo filho da sessão em que foi criada. A sessão começa com seu próprio escopo global. Esse escopo é independente do escopo global da sessão. Você pode criar escopos filho na sessão. Por exemplo, você pode executar um script para criar um escopo filho em uma sessão.

  • Módulos:
    Você pode usar um módulo Windows PowerShell para compartilhar e entregar ferramentas do Windows PowerShell. Um módulo é uma unidade que pode conter cmdlets, scripts, funções, variáveis, aliases e outros itens úteis. A menos que explicitamente definido, os itens em um módulo não estão acessíveis fora do módulo. Portanto, você pode adicionar o módulo à sua sessão e usar os itens públicos sem se preocupar que os outros itens possam substituir os cmdlets, scripts, funções e outros itens em sua sessão.

    A privacidade de um módulo se comporta como um escopo, mas a adição de um módulo para uma sessão não altera o escopo. E o módulo não tem seu próprio escopo, embora os scripts no módulo, como todos os scripts Windows PowerShell, têm seu próprio escopo.

  • Prompts aninhados:
    Da mesma forma, prompts aninhados não tem seu próprio escopo. Quando você insere um prompt aninhado, o prompt aninhado é um subconjunto do ambiente. Porém, você permanece no escopo local.

    Scripts têm seu próprio escopo. Se você estiver depurando um script e atingir um ponto de interrupção no script, você pode inserir o escopo do script.

  • Opção Particular:
    Variáveis e aliases têm uma propriedade Opção que pode ter um valor de Particular. Itens que têm a opção Particular poderão ser exibidos e alterados no escopo no qual eles são criados, mas não podem ser visualizados ou alterados fora do escopo.

    Por exemplo, se você cria uma variável que tem uma opção particular no escopo global e, em seguida, executa um script, comandos Get-Variable no script não exibem a variável particular. Isso ocorre mesmo que você use o modificador de escopo global.

    Você pode usar o parâmetro Opção dos cmdlets New-Variable, Set-Variable, New-Alias e Set-Alias para definir o valor da propriedade Opção como Particular.

  • Visibilidade:
    A propriedade Visibilidade de uma variável ou alias determina se você pode ver o item fora do contêiner, como um módulo, no qual ele foi criado. Visibilidade é desenvolvida para contêineres da mesma forma que o valor Particular da propriedade Opção foi desenvolvido para escopos.

    A propriedade Visibilidade usa os valores Público e Particular. Itens com visibilidade particular poderão ser exibidos e alterados apenas no contêiner em que eles foram criados. Se o contêiner for adicionado ou importado, os itens que têm visibilidade particular não podem ser exibidos nem alterados.

    Como Visibilidade é projetada para contêineres, ela funciona diferentemente em um escopo. Se você criar um item que tem visibilidade particular no escopo global, você não pode exibir ou alterar o item em nenhum escopo. Se você tentar exibir ou alterar o valor de uma variável que tenha visibilidade particular, o Windows PowerShell retorna uma mensagem de erro.

    Você pode usar os cmdlets New-Variable e Set-Variable para criar uma variável que tenha visibilidade particular.

EXEMPLOS

Exemplo 1: Alterar o Valor de uma Variável Somente em um Script

O comando a seguir altera o valor da variável $ConfirmPreference em um script. A alteração não afeta o escopo global.

Primeiro, para exibir o valor da variável $ConfirmPreference no escopo local, use o seguinte comando:

          C:\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 variável $ConfirmPreference e, em seguida, informa seu valor no escopo do script. O resultado deve ser semelhante a seguinte saída:

          The value of $ConfirmPreference is Low.

Em seguida, teste o valor atual da variável $ConfirmPreference no escopo atual.

          C:\PS> $ConfirmPreference
          High

Este exemplo mostra que alterações no valor de uma variável no escopo do script não afetam o valor dessa variável no escopo pai.

Exemplo 2: Exibir um Valor de Variável em Escopos Diferentes

Você pode usar os modificadores de escopo para exibir o valor de uma variável no escopo local e em um escopo pai.

Primeiro, defina uma variável $test no escopo global.

        $test = "Global"

Em seguida, crie um script Sample.ps1 que defina a variável $test. No script, use um modificador de escopo para se referir a versões globais ou locais da variável $test. Insira o corpo da seção aqui.

          # In Sample.ps1

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

Quando você executa Sample.ps1, a saída deve se parecer com a seguinte saída:

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

Quando o script for concluído, somente o valor global de $test é definido na sessão.

          C:\PS> $test
          Global

Exemplo 3: Altere o Valor de uma Variável em um Escopo Pai

A menos que você proteja um item usando a opção Particular ou outro método, você pode exibir e alterar o valor de uma variável em um escopo pai.

Primeiro, defina uma variável $test no escopo global.

        $test = "Global"

Em seguida, crie um script Sample.ps1 que defina a variável $test. No script, use um modificador de escopo para se referir a versões globais ou locais da variável $test.

          # In Sample.ps1

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

Quando o script for concluído, o valor global de $test é alterado.

          C:\PS> $test
          Local

Exemplo 4: Criando uma Variável Particular

Uma variável particular é uma variável que tem uma propriedade Opção com um valor de Particular. Variáveis particulares são herdadas por escopo filho, mas elas podem ser exibidas ou alteradas apenas no escopo em que elas foram criadas.

O comando a seguir cria uma variável particular chamada $ptest no escopo local.

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

Você pode exibir e alterar o valor de $ptest no escopo local.

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

Em seguida, crie um script Sample.ps1 que contém os comandos a seguir. O comando tenta exibir e alterar o valor de $ptest.

          # In Sample.ps1

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

Como a variável $ptest não está visível no escopo do script, a saída está vazia.

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

Exemplo 5: Usando uma Variável Local em um Comando Remoto

Para indicar que uma variável em um comando remoto foi criada na sessão local, use o modificador de escopo Usando. Por padrão, o Windows PowerShell supõe que as variáveis em comandos remotos foram criadas na sessão remota.

A sintaxe é:

           $Using:<VariableName>

Por exemplo, os comandos a seguir criam uma variável $Cred na sessão local e, em seguida, usam a variável $Cred em um comando remoto:

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

O escopo Usando foi apresentado no Windows PowerShell 3.0.

Em Windows PowerShell 2.0, para indicar que uma variável foi criada na sessão local, use o seguinte formato de comando.

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

CONSULTE TAMBÉM

about_Variables

about_Environment_Variables

about_Functions

about_Script_Blocks