Header Ads

Escopos no PowerShell

Em muitas linguagens de programação, existe o conceito de escopo. Definido como quais variáveis ​​e funções estão disponíveis em qual contexto. Um exemplo é se uma variável está disponível para todas as funções em um script do PowerShell ou apenas uma única função definida. Os escopos do PowerShell abrangem vários escopos diferentes que podem ser usados, como escopos globais, locais ou de script.

Quais são os escopos do PowerShell?

Conforme mencionado na introdução, existem vários escopos primários. Eles são globais, locais e de script e informam ao PowerShell quais variáveis ​​e funções estão disponíveis em qual contexto. Ao fazer referência a escopos, você geralmente usa prefixos de escopo para alcançar variáveis ​​fora do escopo local atual. Isso é mais fácil de entender por meio de exemplos.

Escopo Global

O escopo global significa que uma variável estará disponível para todas as funções e comandos, independentemente da localização, como $ MyVar = $ True ou $ Global: MyVar = $ True. Ao iniciar o PowerShell, todas as variáveis ​​iniciais têm escopo global. Se não houver escopos filho, global é o mesmo que escopo local e de script até que existam escopos filho.

 # Está no escopo global $ MyVar = $ True Function Test-VariableScope {# Quando uma variável não é encontrada no escopo atual, procure até que seja encontrada Write-Host "Escopo global: $ MyVar "# Redefina a variável no escopo local $ MyVar = $ False Write-Host" Escopo local: $ MyVar "Write-Host" Escopo global: $ ($ Global: MyVar) "} Test-VariableScope # Uma vez que a variável com escopo local faz não existe mais, retorna o escopo global Write-Host "Global Scope: $ MyVar" 

Escopo local

O escopo atual é sempre local e, portanto, o escopo padrão também. Quando nenhum modificador de escopo é usado em uma variável, o escopo é local, como $ MyVar = $ True. O escopo local pode ser difícil de entender, pois esse escopo é relativo ao local atual e uma variável local pode estar em escopos diferentes ao mesmo tempo.

 # Este está no escopo local (e escopo global desde a raiz do script) $ MyVar = $ True Write-Host "Escopo local: $ MyVar" Write-Host "Escopo local Explícito: $ ($ Local : MyVar) "Function Test-VariableScope {# Esta variável está no escopo local em relação a Test-VariableScope $ MyVar = $ False Write-Host" Escopo local: $ MyVar "Write-Host" Escopo local (explícito): $ ($ Local: MyVar) "} Test-VariableScope # Esta variável está de volta ao escopo local inicialmente definido Write-Host" Escopo local: $ MyVar "Write-Host" Escopo local Explícito: $ ($ Local: MyVar) "

Ao usar o código-fonte de um script, como. my-script. ps1, você adicionará toda a saída desse script ao escopo local!

Escopo do script

Finalmente, o escopo do script é um pouco mais complicado. É o escopo do arquivo de script ancestral mais próximo ou o escopo global se não for executado em um arquivo de script como $ script: var = $ true. Os escopos Global, Script e Local são iguais para a variável $ MyVar = $ True quando usada em um único script e até mesmo em funções.

 # Está no escopo do Script, incluindo o Script e o escopo Local $ MyVar = $ True Write-Host "Script Scope: $ ($ Script: MyVar)" Function Test-VariableScope {# Esta variável está no local escopo relativo a Test-VariableScope $ MyVar = $ False # O escopo do Script faz referência ao mesmo que $ MyVar variável inicialmente definida Write-Host "Script Scope: $ ($ Script: MyVar)"} Test-VariableScope # Esta variável está de volta ao Escopo do script definido inicialmente Write-Host "Script Scope: $ ($ Script: MyVar)" 

Ao contrário do dot-sourcing um script que adiciona tudo ao escopo local, usando o & O operador de chamada executará o script, mas deixará tudo no escopo do script que é relativo ao próprio script.

O que são as opções Private, Using, Workflow e AllScope?

Junto com os escopos gerais, existem várias opções que podem modificar a visibilidade ou disponibilidade das variáveis. Então, quais são essas opções diferentes com escopos?

O modificador de escopo privado

Quando você define uma variável ou apelido como privado, a variável ou apelido só é visível e modificável dentro desse contexto. Como você pode ver no exemplo abaixo, a versão privada do

 Remove-Variable TestVar Remove-Variable TestVar2 Remove-Variable TestVar3 # Duas maneiras de criar uma variável privada, observe que esta é uma opção e não um escopo (aplicado a uma variável com escopo) New-Variable -Name ' TestVar '-Value $ True -Scope' Global '-Option' Private '$ Private: TestVar2 = $ True Write-Host "Escopo global (TestVar): $ TestVar" Write-Host "Escopo global (TestVar2): $ TestVar" $ TestVar3 = $ True Function Test-Function {# Como as duas primeiras variáveis ​​são privadas, elas não são vistas Write-Host "Local Scope (TestVar): $ TestVar" Write-Host "Local Scope (TestVar2): $ TestVar2" # TestVar3 faz não existe localmente, então o PowerShell procura e encontra uma variável não privada em Global Write-Host "Local Scope (TestVar3): $ TestVar3"} Test-Function 

O que é o modificador de uso?

Esta é uma variável especial que é usada pelos cmdlets e constrói Invoke-Command, Start-Job, Start-ThreadJob ou ForEach-Object -Parallel. Isso só funcionará com Invoke-Command quando estiver sendo executado em um computador remoto, como com o parâmetro ComputerName.

 # Normalmente, a variável LocalCSVData não estará disponível para o scriptblock em execução no computador remoto sem o modificador Using. $ LocalCSVData = Import-CSV -Path 'mydata. csv' Invoke-Command -ComputerName 'RemoteComputer' -ScriptBlock {$ Using: LocalCSVData | ForEach-Object {... faça algo ...}} 

Fluxo de trabalho e AllScope

Embora muito menos usados, existem dois modificadores adicionais. O modificador Workflow é usado para fazer referência a variáveis ​​em um fluxo de trabalho do PowerShell (não disponível no PowerShell Core / 7). O modificador AllScope tornará uma variável disponível em todos os escopos. Isso também significa que se a variável for modificada em um escopo filho, ela refletirá nos escopos raiz. Esta é uma maneira de evitar a necessidade de prefixar uma variável com global ao tentar referenciá-la em escopos filho.

Conclusão

Os escopos são úteis para limitar a visibilidade e disponibilidade de variáveis, funções e apelidos. Os escopos também podem ser problemáticos quando não está claro em qual escopo uma variável está. Espero que este artigo esclareça como os escopos são usados ​​no PowerShell e o que você pode fazer com eles!

Nenhum comentário