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:
1 2 |
# Criar uma variável em um Escopo Global New-Variable -Scope Global -Name VariavelGlobal -Value "Hello World 1!" |
1 2 3 4 5 6 7 8 |
PS C:\Users\RobotChicken> Get-Variable -Name VariavelGlobal -Scope Global Name Value ---- ----- VariavelGlobal Hello World 1! PS C:\Users\RobotChicken> $VariavelGlobal Hello World 1! |
1 2 3 4 5 6 7 8 9 10 11 |
#Arquivo: script.ps1 # Declara Variável Set-Variable -Scope Global -Name VariavelGlobal -Value "Hello World 1!" #Declara Função para Alterar Variável Function VariavelGlobalFuncao{ $Global:VariavelGlobal = "Bye World 1" } #Invoca Função VariavelGlobalFuncao #Verifica Variável $VariavelGlobal |
1 2 |
PS C:\Users\RobotChicken> .\script.ps1 Hello World 1! |
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:
1 2 3 4 5 6 7 8 9 10 11 |
#Arquivo: script.ps1 # Declara Variável Set-Variable -Scope Global -Name VariavelGlobal -Value "Hello World 1!" #Declara Função para Alterar Variável Function VariavelGlobalFuncao{ $Global:VariavelGlobal = "Bye World 1" } #Invoca Função VariavelGlobalFuncao #Verifica Variável $VariavelGlobal |
1 2 |
PS C:\Users\RobotChicken> .\script.ps1 Bye World 1 |
Local
O Escopo Local pode ser qualquer um dos tipos de Escopo. Basicamente é o atual Escopo ativo.
Exemplo:
1 2 |
# Criar uma variável em um Escopo Local New-Variable -Scope Local -Name VariavelLocal -Value "Hello World 2!" |
1 2 3 4 5 6 7 8 |
PS C:\Users\RobotChicken> Get-Variable -Name VariavelLocal -Scope Local Name Value ---- ----- VariavelLocal Hello World 2! PS C:\Users\RobotChicken> $VariavelLocal Hello World 2! |
1 2 3 4 5 6 7 8 9 10 11 12 |
#Arquivo: script.ps1 # Declara Variável Set-Variable -Scope Local -Name VariavelLocal -Value "Hello World 2!" #Declara Função para Alterar Variável Function VariavelLocalFuncao{ $VariavelLocal = "Bye World 2" } #Invoca Função VariavelLocalFuncao #Verifica Variável $VariavelLocal |
1 2 |
PS C:\Users\RobotChicken> C:\Users\RobotChicken\script.ps1 Hello World 2! |
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:
1 2 3 4 5 6 7 8 9 10 11 12 |
#Arquivo: script.ps1 # Declara Variável Set-Variable -Scope Local -Name VariavelLocal -Value "Hello World 2!" #Declara Função para Alterar Variável Function VariavelLocalFuncao{ $Global:VariavelLocal = "Bye World 2" } #Invoca Função VariavelLocalFuncao #Verifica Variável $Global:VariavelLocal |
1 2 |
PS C:\Users\RobotChicken> .\script.ps1 Bye World 2 |
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:
1 2 |
# Criar variável em um Escopo de Script Set-Variable -Scope Script -Name VariavelScript -Value "Hello World 3!" |
1 2 3 4 5 6 7 8 |
PS C:\Users\RobotChicken> Get-Variable -Name VariavelScript -Scope Script Name Value ---- ----- VariavelScript Hello World 3! PS C:\Users\RobotChicken> $VariavelScript Hello World 3! |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Arquivo: script.ps1 # Declara Variável $VariavelScript = "Hello World 3!" #Declara Função para Alterar Variável Function VariavelScriptFuncao{ $VariavelScript = "Bye World 3" } #Invoca Função VariavelScriptFuncao #Verifica Variável $VariavelScript |
1 2 |
PS C:\Users\RobotChicken> .\script.ps1 Hello World 3! |
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:
1 2 3 4 5 6 7 8 9 10 11 12 |
#Arquivo: script.ps1 # Declara Variável Set-Variable -Scope Script -Name VariavelScript -Value "Hello World 3!" #Declara Função para Alterar Variável Function VariavelScriptFuncao{ $Script:VariavelScript = "Bye World 3" } #Invoca Função VariavelScriptFuncao #Verifica Variável $VariavelScript |
1 2 |
PS C:\Users\RobotChicken> C:\Users\RobotChicken\script.ps1 Bye World 3 |
Private
O Escopo Private é um Escopo particular onde seus itens não podem ser exibidos ou alterados fora do Escopo Local.
Exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 |
#Arquivo: script.ps1 # Declara Variável Set-Variable -Scope Private -Name VariavelPrivate -Value "Hello World 4!" #Declara Função para Alterar Variável Function VariavelPrivateFuncao{ VariavelPrivate = "Bye World 4" } #Invoca Função VariavelPrivateFuncao #Verifica Variável $VariavelPrivate |
1 2 |
PS C:\Users\RobotChicken> .\script.ps1 Hello World 4! |
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:
1 2 3 4 5 6 7 8 9 10 11 12 |
#Arquivo: script.ps1 # Declara Variável Set-Variable -Scope Private -Name VariavelPrivate -Value "Hello World 4!" #Declara Função para Alterar Variável Function VariavelPrivateFuncao{ $Script:VariavelPrivate = "Bye World 4" } #Invoca Função VariavelPrivateFuncao #Verifica Variável $VariavelPrivate |
1 2 |
PS C:\Users\RobotChicken> .\script.ps1 Bye World 4 |
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:
1 2 3 4 5 6 |
# Arquivo: script.ps1 # Define Variável no Escopo Global Set-Variable -Name VariavelGlobal -Value "Hello World" -Scope Global # Invoca a Variável Global $VariavelGlobal |
1 2 |
PS C:\Users\RobotChicken> .\script.ps1 Hello World |
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:
1 2 3 4 5 6 7 8 9 10 11 12 |
# Arquivo: script.ps1 # Define Variável no Escopo Global Set-Variable -Name VariavelGlobal -Value "Hello World" -Scope Global # Invoca a Variável Global $VariavelGlobal # Altera a Variável Global $VariavelGlobal = "Bye World" # Invoca novamente a Variável Global $VariavelGlobal |
1 2 3 |
PS C:\Users\RobotChicken> .\script.ps1 Hello World Bye World |
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.
1 2 |
PS C:\Users\RobotChicken> $VariavelGlobal Hello World |
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:
1 2 3 4 5 6 |
# Arquivo: script.ps1 # Declara Variável com Opção AllScope Set-Variable -Name TodoEscopo -Value "In All Scopes" -Option AllScope # Invoca Variável $TodoEscopo |
1 2 |
PS C:\Users\RobotChicken> .\script.ps1 In All Scopes |
1 2 3 4 5 6 |
# Arquivo: script.ps1 # Declara Alias com Opção AllScope Set-Alias -Name DataTodoEscopo -Value Get-Date -Option AllScope # Invoca Alias DataTodoEscopo |
1 2 3 |
PS C:\Users\RobotChicken> .\script.ps1 quarta-feira, 10 de julho de 2019 10:14:57 |
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:
1 2 3 4 5 |
# Declara Variável Global Set-Variable -Name NovaVariavel -Value "Hello World" -Scope Global # Invoca Variável $Global:NovaVariavel |
1 2 |
PS C:\Users\RobotChicken> .\script.ps1 Hello World |
Exemplo 2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Declara Variável Set-Variable -Name NovaVariavel -Value "Hello World" -Scope Global # Declara Função Function Global:NovaVariavel{ # Altera Variável Set-Variable -Name NovaVariavel -Value "Bye World" -Scope Script # Invoca Variável $NovaVariavel } #Invoca Função no Escopo Global Global:NovaVariavel # Invoca Variável Novamente $Global:NovaVariavel |
1 2 3 |
PS C:\Users\RobotChicken> .\script.ps1 Bye World Hello World |
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!
[…] * Caso não se lembre como utilizar Escopos no Powershell, dê uma olhada neste artigo! […]