TÓPICO about_Scopes DESCRIÇÃO RESUMIDA Explica o conceito de escopo no Windows PowerShell e mostra como definir e alterar o escopo de elementos. DESCRIÇÃO LONGA O Windows PowerShell protege o acesso a variáveis, aliases, funções e unidades do Windows PowerShell (PSDrives), limitando onde podem ser lidos e alterados. Com a imposição de algumas regras simples de escopo, o Windows PowerShell ajuda a assegurar que você não altere inadvertidamente um item que não deveria ser alterado. Estas são as regras básicas de escopo: - Um item que você inclui em um escopo é visível no escopo onde foi criado e em qualquer escopo filho, a menos que você o torne particular explicitamente. Você pode colocar variáveis, aliases, funções ou unidades do Windows PowerShell em um ou mais escopos. - Um item que você criou em um escopo só pode ser alterado no escopo onde foi criado, a menos que você especifique explicitamente outro escopo. Se você criar um item em um escopo, e esse item compartilhar seu nome com um item em outro escopo, será possível ocultar o item original sob o novo item. No entanto, ele não será substituído nem alterado. Escopos do Windows PowerShell Os escopos do 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 em vigor quando o Windows PowerShell é iniciado. As variáveis e as funções presentes quando o Windows PowerShell é iniciado foram criadas no escopo global. Isso inclui variáveis automáticas e preferenciais. Inclui também as variáveis, os aliases e as funções nos seus perfis do 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 de script. Para os comandos de um script, o escopo de script é o escopo local. Específico: Os itens no escopo específico não podem estar fora do escopo atual. Você pode usar o escopo específico para criar uma versão específica de um item com o mesmo nome em outro escopo. Escopos numerados: Você pode fazer referência a escopos por nome ou por um número que descreve a posição relativa de um escopo em relação a outro. Escopo 0 representa o escopo atual ou local. Escopo 1 indica o escopo pai imediato. Escopo 2 indica o pai do escopo pai, e assim por diante. Os escopos numerados serão úteis se você tiver criado muitos 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 que você criou). No Windows PowerShell, todos os escopos são filhos do escopo global, mas você pode criar muitos escopos e muitos escopos recursivos. A menos que você torne os itens particulares explicitamente, os itens no escopo pai estarão disponíveis ao escopo filho. No entanto, itens que você cria e altera no escopo filho não afetam o escopo pai, a menos que você especifique explicitamente o escopo quando criar os itens. Herança Um escopo filho não herda as variáveis, os aliases e as funções do escopo pai. A menos que um item seja particular, o escopo filho pode exibir os itens do escopo pai. Ele pode também alterar esses itens especificando o escopo pai explicitamente, mas eles não fazem parte do escopo filho. Contudo, um escopo filho é criado com um conjunto de itens. Normalmente, ele inclui todos os aliases que têm a opção AllScope. Essa opção será discutida posteriormente neste tópico. Ele inclui todas as variáveis que têm a opção AllScope, mais algumas que podem ser usadas para personalizar o escopo, como MaximumFunctionCount. Para localizar os itens em um escopo específico, use o parâmetro Scope 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, alias ou função, use um modificador de escopo. Os valores válidos de um modificador são Global e Script. A sintaxe de um modificador de escopo em uma variável é: $[<modificador-de-escopo>]:<nome> = <valor> A sintaxe de um modificador de escopo em uma função é: function [<modificador-de-escopo>]:<nome> {<corpo-da-função>} O escopo padrão para scripts é o escopo de script. O escopo padrão para funções e aliases é o local, mesmo que sejam definidos 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 = "um" Para criar a mesma variável no escopo global, use o modificador de escopo global: $global:a = "um" Para criar a mesma variável no escopo de script, use o modificador de escopo de script: $script:a = "um" 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 "Olá, mundo" } Você também pode usar modificadores de escopo para fazer referência a uma variável em outro escopo. O comando a seguir faz referência à variável $test, primeiro no escopo local, e depois no escopo global: $test $global:test A opção AllScope Variáveis e aliases têm uma propriedade Option que pode tirar um valor de AllScope. Itens que têm a propriedade AllScope tornam-se parte de qualquer escopo filho que você crie, embora não sejam herdados retroativamente pelos escopos pai. Um item com a propriedade AllScope é visível no escopo filho, e faz parte desse escopo. Alterações no item em qualquer escopo afetam todos os escopos nos quais a variável está definida. Gerenciando o escopo Vários cmdlets têm um parâmetro Scope que permite obter ou definir (criar e alterar) itens em um escopo específico. Use o seguinte comando para localizar todos os cmdlets na sua sessão que têm um parâmetro Scope: get-help * -parameter scope Para localizar as variáveis visíveis em um escopo específico, use o parâmetro Scope de Get-Variable. Os parâmetros visíveis incluem parâmetros globais, parâmetros no escopo pai e no escopo atual. Por exemplo, o comando a seguir obtém as variáveis 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 Scope de Set-Variable. O comando a seguir cria uma variável no escopo global: new-variable -scope global -name a -value "Um" Você também pode usar o parâmetro Scope dos 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 de um escopo específico, use o cmdlet Get-Item quando estiver no escopo. O cmdlet Get-Item não tem parâmetro Scope. Usando a notação de dot sourcing com o escopo Scripts e funções seguem todas as regras de escopo. Você os cria em um escopo específico e eles afetam somente aquele escopo, a menos que você use um parâmetro de cmdlet ou um modificador de escopo para alterar aquele escopo. Mas você pode adicionar um script ou uma função ao escopo atual usando a notação de dot sourcing. Então, quando um script for executado no escopo atual, qualquer função, alias e variável que o script criar estará disponível no escopo atual. Para adicionar uma função ao escopo atual, digite um ponto (.) e um espaço antes do caminho e do nome da função na chamada para a função. Por exemplo, para executar o script Sample.ps1 a partir 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 um script, ele não é acrescentado ao escopo atual. O exemplo a seguir usa o operador de chamada: & c:\scripts.sample.ps1 Qualquer alias, função ou variável que o script Sample.ps1 criar não estará disponível no escopo atual. Restringindo sem o escopo Alguns conceitos do Windows PowerShell são semelhantes ao escopo ou à interação com o escopo. Esses conceitos podem ser confundidos com o escopo ou com o comportamento do escopo. Sessões, módulos e prompts aninhados são ambientes autossuficiente s, mas não são escopos filhos do escopo global da sessão. Sessões: Uma sessão é um ambiente no qual o Windows PowerShell é executado. Quando você cria uma sessão em um computador remoto, o Windows PowerShell estabelece uma conexão persistente com o computador remoto. A conexão persistente permite que você use a sessão para vários comandos relacionados. Como uma sessão é um ambiente contido, tem seu próprio escopo, mas uma sessão não é um escopo filho da sessão em que foi criada. A sessão é iniciada com seu próprio escopo global. Esse escopo é independente do escopo global da sessão. Você pode criar escopos filhos na sessão. Por exemplo, é possível executar um script para criar um escopo filho em uma sessão. Módulos: Você pode usar um módulo do Windows PowerShell para compartilhar e fornecer 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 são acessíveis de fora do módulo. Portanto, você pode adicionar o módulo à sua sessão e usar os itens públicos sem se preocupar, pois os outros itens não podem anular cmdlets, scripts, funções e outros itens na sua sessão. A privacidade de um módulo se comporta como um escopo, mas acrescentar um módulo a 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 do Windows PowerShell, tenham seus próprios escopos. Prompts aninhados: De forma semelhante, os prompts aninhados não têm seus próprios escopos. Quando você entra em um prompt aninhado, ele é um subconjunto do ambiente, mas você permanece dentro do escopo local. Os scripts têm seus próprios escopos. Se você estiver depurando um script e alcançar um ponto de interrupção, entrará no escopo do script. Opção particular: Aliases e variáveis têm uma propriedade Option que pode tirar um valor de Private. Itens que têm a opção Private podem ser exibidos e alterados no escopo em que foram criados, mas não podem ser exibidos ou alterados fora desse escopo. Por exemplo, se você criar uma variável com uma opção particular no escopo global e então executar um script, os comandos Get-Variable no script não exibirão a variável particular. Isso ocorrerá até mesmo se você usar o modificador de escopo global. Você pode usar o parâmetro Option dos cmdlets New-Variable, Set-Variable, New-Alias e Set-Alias para definir o valor da propriedade Option como Private. Visibilidade: A propriedade Visibility de uma variável ou de um alias determina se você pode consultar o item fora do contêiner no qual foi criado - por exemplo, um módulo. Visibility se destina aos contêineres, da mesma forma que o valor Private da propriedade Option se destina aos escopos. A propriedade Visibility retira os valores Public e Private. Itens que têm visibilidade particular podem ser exibidos e alterados somente no contêiner em que foram criados. Se o contêiner for adicionado ou importado, os itens com visibilidade particular não poderão ser exibidos ou alterados. Como Visibility se destina a contêineres, funciona de forma diferente em um escopo. Se você criar um item com visibilidade particular no escopo global, não poderá exibir ou alterar o item em qualquer escopo. Se você tentar exibir ou alterar o valor de uma variável com visibilidade particular, o Windows PowerShell retornará uma mensagem de erro. Você pode usar os cmdlets New-Variable e Set-Variable para criar uma variável com 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 contendo os seguintes comandos: $ConfirmPreference = "Low" "O valor de `$ConfirmPreference é $ConfirmPreference." Execute o script. O script altera o valor da variável $ConfirmPreference, e então relata seu valor no escopo do script. A saída deve ser semelhante à seguinte: O valor de $ConfirmPreference é Low. Em seguida, teste o valor atual da variável $ConfirmPreference no escopo atual. C:\PS> $ConfirmPreference High Esse exemplo mostra que as alterações no valor de uma variável no escopo de script não afetam o valor daquela variável no escopo pai. Exemplo 2: exibir o valor de uma variável em escopos diferentes Você pode usar 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 fazer referência às versões global ou local da variável $test. # Em Sample.ps1 $test = "Local" "O valor local de `$test é $test." "O valor global de `$test é $global:test." Quando você executar Sample.ps1, a saída deverá se parecer com a seguinte: O valor local de $test é Local. O valor global de $test é Global. Quando o script for concluído, somente o valor global de $test será definido na sessão. C:\PS> $test Global Exemplo 3: alterar o valor de uma variável em um escopo pai A menos que proteja um item usando a opção Private 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 fazer referência às versões global ou local da variável $test. # Em Sample.ps1 $global:test = "Local" "O valor global de `$test é $global:test." Quando o script for concluído, somente o valor global de $test será alterado. C:\PS> $test Local Exemplo 4: criando uma variável particular Uma variável particular é uma variável com uma propriedade Option que tem um valor Private. As variáveis particulares são herdadas pelo escopo filho, mas só podem ser exibidas ou alteradas no escopo em que 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 contendo os comandos a seguir. O comando tenta exibir e alterar o valor de $ptest. # Em Sample.ps1 "O valor de `$Ptest é $Ptest." "O valor de `$Ptest é $global:Ptest." Como a variável $ptest não é visível no escopo de script, a saída é vazia. "O valor de $Ptest é ." "O valor de $Ptest é ." CONSULTE TAMBÉM about_Variables about_Environment_Variables about_Functions about_Script_Blocks