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


12

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

Aqui está uma demonstração no console. Verifico $xse não está definido no escopo global, mostro o conteúdo ScopeTest.ps1e o executo e, por último, verifico se $xestá definido novamente. Como esperado, $xé criado e usado apenas dentro do escopo do script e não persiste no ambiente global após o término do script.

insira a descrição da imagem aqui

No ISE, isto parece funcionar se o script for chamado usando a janela do console.

insira a descrição da imagem aqui

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.

insira a descrição da imagem aqui

Isso pode dificultar a escrita e a solução de problemas de scripts, se o script assumir que será iniciado em um ambiente limpo (ou seja: quaisquer variáveis ​​definidas no script ainda não devem existir). Por que o ISE se comporta dessa maneira?

Uma resposta a esta pergunta aborda o tópico apenas um pouco, mencionando "fonte de pontos", mas espero obter uma explicação mais completa aqui. Além disso, se a documentação existir sobre o motivo pelo qual o script é executado de maneira diferente no ISE e no console, uma referência também seria agradável.

Respostas:


9

Nos exemplos de seu script, você criou variáveis ​​e não as destruiu no final do seu script. O ISE cria uma instância ao vivo 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 criar scripts à medida que você avança. Dessa forma, você não precisa continuar executando seu script repetidamente (há situações em que isso não seria o ideal) para garantir que a próxima linha de código funcionasse. Você digita no shell e, se funcionar, adiciona-o à seção de script.

Esse comportamento talvez seja melhor descrito aqui: http://technet.microsoft.com/en-us/library/dd819480.aspx

Trecho relevante:

Todos os painéis no ISE estão sempre no mesmo escopo.

Se você não deseja que suas variáveis ​​permaneçam no shell após a conclusão do script, você deve Remove-Variablefazê - las.

Por exemplo:

Remove-Variable x

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


2

No ISE Powershell, é essencialmente despejar o script no shell e depois executá-lo. Como se você digitasse no shell, então o executasse. Portanto, a variável está disponível para essa sessão. Para ver outras diferenças, confira esta postagem do MSDN .


Não vejo nada na postagem vinculada abordando esse comportamento.
Iszi 7/07

0

então o ISE tem como escopo global. A menos que você remova todas as variáveis ​​criadas ao trabalhar no ISE, todas as variáveis ​​estarão disponíveis após a execução do script. Quando uso o ISE para criar meu script, sempre testarei com um console diferente do PowerShell aberto. Isso me permite garantir que tudo funcione como eu pretendia.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.