Por que o PowerShell ISE não isola variáveis de script no escopo de script?

11

No PowerShell, o escopo deve manter objetos (variáveis, aliases, funções etc.) em scripts afetando o ambiente global. Isto parece funcionar bem na linha de comando, mas não no ISE.

Aqui está uma demonstração no console. Verifico que $x não está definido no escopo global, mostro o conteúdo de ScopeTest.ps1 e, em seguida, o executo e, por último, verifico se $x está definido novamente. Como esperado, $x é criado e usado apenas dentro do escopo do script e não persiste no ambiente global após o script ser finalizado.

NoISE,issoparecefuncionarseoscriptforchamadousandoajaneladoconsole.

No entanto, se eu realmente usar o botão "Executar Script", ou F5, as variáveis dentro do script persistirão após a conclusão.

Issopodedificultaraescritaearesoluçãodeproblemasdescripts,seoscriptpressupuserqueeleseráiniciadoapartirdeumambientelimpo(porexemplo,qualquervariáveldefinidanoscriptaindanãodeveráexistir.).PorqueoISEsecomportadessamaneira?

Umarespostapara esta pergunta aborda o tópico apenas ligeiramente, mencionando "sourcing de pontos", mas espero obter uma explicação mais completa aqui. Além disso, se existir documentação sobre por que o script é executado de maneira diferente no ISE do que no console, uma referência também seria interessante.

    
por Iszi 06.07.2014 / 00:20

3 respostas

9

Nos exemplos de script, você criou variáveis e não as destruiu no final do script. O ISE cria uma instância ativa do powershell que carrega e executa o script quando você clica em executar. A diferença é que o shell integrado pode continuar o script. Isso é ideal para depurar o ambiente e para criar scripts a qualquer momento. Dessa forma, você não precisa continuar executando o script várias vezes (há situações em que isso não seria o ideal) para garantir que a próxima linha de código funcionasse. Você o digita no shell e, se funcionar, você o adiciona à seção de script.

Esse comportamento talvez seja melhor descrito aqui: link

Trecho relevante:

All panes in ISE are always in the same scope.

Se você não quiser que suas variáveis morem no shell depois que o script for concluído, você deve Remove-Variable delas.

Por exemplo:

Remove-Variable x

Você pode adicionar uma instância "limpa" do powershell ao ISE clicando em Arquivo- > Nova guia do Powershell

    
por 07.07.2014 / 21:06
2

No ISE, o Powershell essencialmente despeja o script no shell e o executa. Como se você o tivesse digitado no shell, então o executasse. Portanto, a variável está disponível para essa sessão. Para ver outras diferenças, confira este MSDN post.

    
por 06.07.2014 / 06:11
0

para que o ISE seja escopo como global. A menos que você remova todas as variáveis criadas durante o trabalho no ISE, todas as variáveis estarão disponíveis depois que o script for executado. Quando uso o ISE para criar meu script, sempre testo com um console diferente do PowerShell aberto. Isso me permite ter certeza de que tudo funciona como eu pretendia.

    
por 07.07.2014 / 22:37

Tags