Olá pessoal, tudo bem? Espero que sim!

Hoje iremos falar sobre como o Powershell pode limitar o acesso a seus recursos em níveis diferentes através do componente Escopo.

O que é Escopo?

Escopo é um componente do Powershell que restringe o acesso a funções, variáveis, aliases, e unidades (PSDrives) para limitar o que pode ser lido ou alterado. Ele serve como uma trava de segurança para evitar alterações indesejadas ou inesperadas em algum componente por algum equívoco. Quando trabalhamos com Escopo, qualquer item criado somente estará disponível para utilização ou alteração neste mesmo Escopo ou em qualquer Escopo originado deste (Escopo filho).

Tipos de Escopos do PowerShell

Os Escopos do Powershell vão definir em que nível de execução um valor será retornado. Eles podem indicar uma relação de pai-filho por ordem de grandeza. A seguir, vamos conhecer os tipos de Escopos disponíveis:

Global

É o Escopo padrão quando uma sessão do PowerShell é iniciada. Carrega e disponibiliza para execução, leitura e edição todas as funções, variáveis e aliases instaladas em seu shell.

Exemplo:

Como puderam observar no exemplo acima, nós declaramos a variável $VariavelGlobal, contudo ao invocar o script, o retorno foi o valor armazenado fora da função, mesmo após invocar a função para alterar o valor da variável. Isto acontece porque no contexto de execução de um arquivo .ps1, o escopo que prevalece é o Escopo de Script e o Escopo onde a variável é alterada é o Escopo Local da função. Para consultar a variável alterada na saída do script, precisamos definir o alternador $Global:VariavelGlobal para mudar o Escopo da variável da função para Global.

Exemplo:

Local

O Escopo Local pode ser qualquer um dos tipos de Escopo. Basicamente é o atual Escopo ativo.

Exemplo:

Como puderam observar, no exemplo, assim como no script da variável Global, após a execução do script, o valor retornado não foi o alterado na função declarada e executada. Isto ocorre porque ao invocar o script.ps1, o script foi executado no Escopo de Script e o Escopo onde a variável é alterada é o Escopo Local da função, e como o Escopo Local definido para a variável é o atual no contexto de execução do script, o valor armazenado no escopo atual durante a execução do script  prevaleceu. Neste caso, para retornar o valor da variável alterada pela função, você também precisará alternar esta variável para o Escopo Global.

Exemplo:

Script

É o Escopo atual (ou Local) durante a execução de um script. Todos os comandos, funções e variáveis armazenadas somente estarão disponíveis neste Escopo. Quando você executa um script ao clicar o botão direito no arquivo *.ps1 e clicar “Executar com Powershell“, ou realize qualquer execução diretamente pelo arquivo, o script está será executado no Escopo de Script.

Exemplo:

No caso do exemplo acima, para ter o valor da variável alterado pela função como saída do script, basta alternar o Escopo desta variável para Script.

Exemplo:

Private

O Escopo Private é um Escopo particular onde seus itens não podem ser exibidos ou alterados fora do Escopo Local.

Exemplo:

Como podem observar no exemplo acima, declaramos a variável $VariavelPrivate no Escopo Private e em seguida, declaramos uma função que altera o valor da variável. Em seguida, invocamos a função e finalmente o valor da variável. Quando executamos o script, ele está sendo executado no Escopo de Script e o valor retornado é o atribuído no Escopo Private. Para que o valor alterado seja retornado pelo script, precisamos definir o alternador $Script:VariavelPrivate.

Exemplo:

Relação Pai e Filho

Quando você define um Escopo para um item, este item passa a ser o filho do Escopo definido. Por padrão, todos os Escopos do Powershell são filhos do Escopo Global, ou seja, você poderá utilizar o valor atribuído a ele dentro de um Escopo Local de uma função, por exemplo. Ainda é possível atribuir o parâmetro -Option (Opção) com o valor AllScope (Todo o Escopo) para variáveis e aliases, onde esta variável ou alias estará disponível em qualquer Escopo, inclusive suas alterações desde que no ato da alteração seja mantido a definição do Escopo.

Herança de Escopos

Os Escopos filhos não herdam os items atribuídos ao Escopo Pai, mas eles estarão disponíveis para uso se você especificar o Escopo Pai de forma explícita. Isto quer dizer que quando você estiver no Escopo Local, você pode utilizar qualquer variável do Escopo Global.

Exemplo 1:

Como puderam observar no primeiro exemplo, criamos um script que declara uma variável no Escopo Global e em seguida invoca a variável. Executamos o script que por padrão é executado no Escopo de Script. O valor foi retornado com sucesso devido o Escopo Global ser o pai de todos os Escopos e o seu dado estar disponível no contexto do script.

Exemplo 2:

Neste segundo exemplo, após declarar a variável Global e retornar, realizamos uma alteração na variável sem especificar o Escopo e em seguida a invocamos. O retorno foram a variável armazenada no Escopo Global e a variável alterada só que com o valor declarado posteriormente no script. Isto ocorreu simplesmente por que não definimos qual seria o Escopo da variável, logo, ela foi atribuída em seu Escopo atual que seria no contexto do script, Após a execução do script, se invocarmos somente a $VariavelGlobal, será retornado o valor especificado no Escopo Global, pois, como já vimos, ele é o Escopo padrão do Powershell.

AllScope

A Opção AllScope está disponível somente para variáveis e aliases e indica que o item estará disponível e incluso em qualquer Escopo criado.

Sintaxe:

Set-Variable -Name <nomedavariável>  -Option AllScope

ou

Set-Alias -Name <nomedoalias> -Option AllScope

Exemplos:

Como puderam observar nos exemplos acima, quando atribuímos a opção AllScope, o valor declarado fica disponível em todos os Escopos, seja Global, Script ou Local.

Como Alternar um Escopo

Para alternar facilmente um Escopo de uma função ou variável, basta usar o alternador de Escopo. Somente itens armazenados nos Escopos Global, Local, Script e Private podem ser invocados através dele. São muito utilizados para retornar um valor de uma variável ou executar uma função armazenada em outro Escopo.

Sintaxe:

$<modificarescopo>:<nomevariáveloualias> = <valorvariável>

Function <modificarescopo>:<nomedafunção> { <comandosdafunção }

Exemplo 1:

Exemplo 2:

Como observamos nos exemplos acima, adicionando <Escopo>: na sintaxe de sua variável ou função, você consegue retornar o valor de acordo com o contexto do Escopo definido. Se observar o exemplo 1, executamos o script no Escopo de Script, contudo, ainda sim foi retornado o valor da variável definida no Escopo Global. No exemplo 2, foram retornados os valores da variável do Escopo Global e Script, porque a função foi definida como Global, então, apesar de a variável alterada estar no Escopo de Script, será disponibilizada no Escopo Global, e a variável inicialmente definida como Global, continua como Global, conforme a última chamada referenciando o Escopo.

Conclusão

Os Escopos nos ajudam a limitar o alcance dos objetos armazenados em seu shell. Você pode criar scripts com funções que utilizam variáveis que somente estarão disponíveis para uso dentro do Escopo Local da função, sem que estas afetem o restante das linhas do script. É um excelente recurso a ser explorado quando estamos desenvolvendo scripts estruturados com diversas funcionalidades.

É isso aí galera, por hoje é só. Até o próximo post!

Dúvidas, sugestões, críticas? Entre em contato aqui!

Gostou? Deixe seu comentário e não se esqueçam de curtir a página do Facebook na barra lateral!