Em scripts em lote, as alterações nas variáveis de ambiente têm um impacto global na sessão atual por padrão. Para o PowerShell, o oposto é verdadeiro porque os escopos são usados para isolar as modificações de um script. Aqui, exploraremos como os escopos afetam os scripts do PowerShell e como trabalhar em torno deles
No PowerShell, um “escopo” refere-se ao ambiente atual no qual um script ou shell de comando está operando. Escopos são usados para proteger certos objetos dentro do ambiente de serem modificados involuntariamente por scripts ou funções. Particularmente, as seguintes coisas são protegidas contra modificação por comandos executados em outro escopo, a menos que especificado de outra forma pelos parâmetros nesses comandos:
Novos escopos são criados sempre que você executa um script ou função, ou quando você cria uma nova sessão ou instância do PowerShell. Os escopos criados pela execução de scripts e funções têm um relacionamento “pai / filho” com o escopo do qual eles foram criados. Existem alguns escopos que têm significados especiais e podem ser acessados pelo nome:
Escopos também podem ser referenciados por número em determinados comandos, onde o escopo atual é referido como zero e seus ancestrais são referenciados por números inteiros crescentes. Por exemplo, em um script executado no escopo Global, o escopo do script seria 0 e o escopo global seria 1. Um escopo que foi aninhado no escopo do script, como uma função, referir-se-ia ao escopo global como 2 Os números negativos não funcionarão para referenciar escopos filho - a razão para isto será aparente em breve.
Como mencionado anteriormente, os comandos executados dentro de um escopo não afetarão coisas em outro escopo a menos que especificamente para fazer isso. Por exemplo, se $ MyVar existir no escopo Global e um script executar um comando para definir $ MyVar como um valor diferente, a versão Global de $ MyVar permanecerá inalterada enquanto uma cópia de $ MyVar é colocada no escopo do Script com o novo valor. Se um $ MyVar não existir, um script irá criá-lo dentro do escopo do Script por padrão - não no escopo Global. Isso é importante lembrar quando você aprender sobre o relacionamento pai / filho real entre os escopos.
O relacionamento pai / filho dos escopos no PowerShell é unidirecional. Os comandos podem ver e, opcionalmente, modificar o escopo atual, seu pai e qualquer escopo acima disso. No entanto, eles não podem ver ou modificar coisas em nenhum filho do escopo atual. Isso ocorre principalmente porque, depois que você se moveu para um escopo pai, o escopo filho já foi destruído porque cumpriu sua finalidade. Por exemplo, por que você teria que ver ou modificar uma variável no escopo do Script, a partir do escopo Global, depois que o script fosse encerrado? Há vários casos em que você precisa que as alterações de um script ou de uma função persistam além de sua conclusão, mas não tantas quando você precisa fazer alterações em objetos no escopo do script ou da função antes ou depois de sua execução. (Geralmente, essas coisas serão tratadas como parte do script ou da própria função de qualquer maneira.)
Obviamente, quais são as regras sem exceções? Uma exceção ao acima são escopos particulares. Os objetos nos escopos particulares só podem ser acessados por comandos executados no escopo de onde foram criados. Outra exceção importante são itens que possuem a propriedade AllScope. Essas são variáveis e aliases especiais para os quais uma alteração em qualquer escopo afetará todos os escopos. Os comandos a seguir mostrarão quais variáveis e aliases possuem a propriedade AllScope:
Get-Variable | Where-Object {$ _. Options -match 'AllScope'} Get-Alias | Where-Object {$ _. Options -match 'AllScope')
Para nossa primeira olhada nos escopos em ação, iniciaremos uma sessão do PowerShell em que a variável $ MyVar foi definida para uma string, 'Eu sou uma variável global!', da linha de comando. Em seguida, o seguinte script será executado a partir de um arquivo chamado Scope-Demo.ps1:
FunctionScope {'Alterar $ MyVar com uma função. $ MyVar = 'Eu fui definido por uma função!' "MyVar diz $ MyVar"} "Verificando o valor atual de $ MyVar. ' "MyVar diz $ MyVar" "Alterando $ MyVar por script. ' $ MyVar = 'Fui definido por um script!' "MyVar diz $ MyVar" "FunctionScope" Verificando o valor final de MyVar antes da saída do script. ' "MyVar diz $ MyVar" "
Se os scripts do PowerShell funcionassem da mesma forma que os scripts em lote, esperaríamos que o valor de $ MyVar (ou% MyVar% na sintaxe em lote) mudasse de 'Eu sou uma variável global!' para 'eu tenho definido por um script!' e, finalmente, para 'eu tenho definido por uma função!' onde ficaria até que explicitamente fosse alterado novamente ou a sessão fosse terminada. No entanto, veja o que realmente acontece aqui enquanto nos movemos através de cada um dos escopos - particularmente depois que a função FunctionScope completou seu trabalho e nós verificamos a variável novamente a partir do Script e, posteriormente, o Global, scope.
Como você pode ver, a variável pareceu mudar à medida que avançávamos no script porque, até a função FunctionScope ser concluída, estávamos verificando a variável dentro do mesmo escopo que a última Depois que o FunctionScope foi feito, voltamos para o escopo do Script, onde $ MyVar foi deixado intocado pela função e, quando o script terminou, voltamos para o escopo Global, onde ele não tinha sido modificado.
Então, está tudo bem para ajudá-lo a evitar a aplicação acidental de mudanças no ambiente além de seus scripts e funções, mas e se você realmente quiser fazer mudanças tão modificáveis? ções? Há uma sintaxe especial e bastante simples para criar e modificar objetos além do escopo Local. Basta colocar o nome do escopo no início do nome da variável e colocar dois pontos entre os nomes do escopo e da variável. Assim:
$ global: MyVar $ script: MyVar $ local: MyVar
Você pode usar esses modificadores ao visualizar e definir variáveis. Vamos ver o que acontece com este script de demonstração:
Função FunctionScope {"Alterando $ MyVar no escopo da função local ... '$ local: MyVar =" Este é MyVar no escopo local da função. "' Alterando $ MyVar no escopo do script … '$ Script: MyVar =' MyVar costumava ser definido por um script. Agora definido por uma função. "Alterando $ MyVar no escopo global ... '$ global: MyVar =' MyVar foi definido no escopo global. Agora definido por uma função. "Verificando $ MyVar em cada escopo ... '" Local: $ local: MyVar " Script: $ script: MyVar " Global: $ global: MyVar "} "Obtendo o valor atual de $ MyVar.' "MyVar diz $ MyVar" "Alterando $ MyVar por script. ' $ MyVar = 'Fui definido por um script!' "MyVar diz $ MyVar" FunctionScope 'Verificando $ MyVar do escopo do script antes de sair.' "MyVar diz $ MyVar" "
Como antes, começaremos definindo a variável no escopo Global e finalizaremos com a verificação do resultado final do escopo Global.
Aqui você pode ver que o FunctionScope foi capaz de alterar a variável no escopo do Script, e as alterações persistem após a conclusão.Além disso, a alteração na variável no escopo Global persistiu mesmo depois que o script foi encerrado.Isso pode ser particularmente útil se você tiver que alterar repetidamente variáveis dentro de um script , ou dentro do escopo Global, usando o mesmo código - você apenas define uma função ou script que é escrito para modificar a variável onde e como você precisa dela, e invoca isso sempre que essas mudanças forem necessárias.
Como mencionado anteriormente, Os números de escopo também podem ser usados em determinados comandos para modificar a variável em níveis diferentes em relação ao escopo Local.Aqui está o mesmo script usado no segundo exemplo acima, mas com a função modificada para usar os comandos Get-Variable e Set-Variable com numero de alcance em vez de referenciar diretamente a variável com escopos nomeados:
Função FunctionScope {"Alterando $ MyVar no escopo 0, relativo ao FunctionScope ... 'Set-Variable MyVar" Este é o MyVar no escopo da função 0. "-Scope 0' Alterando $ MyVar no escopo 1, relativo ao FunctionScope ... 'Set-Variable MyVar 'MyVar foi alterado no escopo 1, de uma função.' -Scope 1 'Alterar $ MyVar no escopo 2, em relação ao Functionscope…' MyVar 'Variável de Conjunto' MyVar foi alterado no escopo 2, a partir de uma função. ' -Scope 2 "Verificando $ MyVar em cada escopo ..." Escopo 0: 'Get-Variable MyVar -Scope 0 -ValueOnly' Escopo 1: 'Get-Variable MyVar -Scope 1 -ValueOnly' Escopo 2: 'Get-Variable MyVar -Scope 2 -ValueOnly "}" Obtendo o valor atual de $ MyVar. ' "MyVar diz $ MyVar" "Alterando $ MyVar por script. ' $ MyVar = 'Fui definido por um script!' "MyVar diz $ MyVar" FunctionScope 'Verificando $ MyVar do escopo do script antes de sair.' "MyVar diz $ MyVar" "
Semelhante a antes, podemos ver aqui como os comandos em um escopo podem modificar objetos em seu escopo pai.
Ainda há muito mais que pode ser feito com escopos do que Os escopos afetam mais do que apenas variáveis, e ainda há muito a ser aprendido sobre escopos particulares e variáveis AllScope Para obter informações mais úteis, você pode executar o seguinte comando no PowerShell:
Get-Help about_scopes
O mesmo arquivo de ajuda também está disponível no TechNet.
Crédito da imagem do escopo: spadassin on openclipart
Se você usar o "Modo de descanso" no seu PlayStation 4 ou desligá-lo?
A Sony recomenda que você use o "Modo de descanso" no PlayStation 4 em vez de desligá-lo completamente. O Modo de Repouso é um pouco como o modo de espera no seu PC - ele entra em um modo de baixo consumo em vez de desligar completamente, para que você possa acessar seus jogos mais rapidamente ao acordá-lo.
O atalho para iPhone que ajuda você a alcançar qualquer coisa com apenas uma das mãos
RELACIONADOS: Tablets não estão matando laptops, mas os smartphones estão matando tablets A maioria das pessoas parece preferir telefones com maior telas, mesmo na medida em que esses telefones maiores às vezes empurram as vendas de tablets. Ainda assim, esses telefones maiores não vêm sem suas desvantagens, um dos quais é que eles são um pouco mais difíceis de usar com uma mão.