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

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

No PowerShell, o escopo deve evitar que objetos (variáveis, aliases, funções, etc.) em 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 se $xnão está definido no escopo global, mostro o conteúdo ScopeTest.ps1e depois executo e, por último, verifico se $xestá definido novamente. Como esperado, $xsó é criado e usado 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, isso 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 sua conclusão.

insira a descrição da imagem aqui

Isso pode dificultar um pouco 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 deveriam existir). Por que o ISE se comporta dessa maneira?

Uma resposta paraessa questãoaborda o assunto apenas ligeiramente, mencionando "dot-sourcing", 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 e no console, uma referência também seria boa.

Responder1

Nos seus exemplos de script você criou variáveis ​​e não as destruiu no final do seu 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 criar scripts conforme você avança. Dessa forma, você não precisa ficar 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.

Este 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 fazê Remove-Variable-las.

Por exemplo:

Remove-Variable x

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

Responder2

No ISE, o Powershell é essencialmente despejar o script no shell e depois executá-lo. Como se você tivesse digitado no shell e depois executado. Portanto, a variável está disponível para essa sessão. Para ver outras diferenças, confira istoMSDNpublicar.

Responder3

portanto, o ISE tem escopo global. A menos que você remova todas as variáveis ​​criadas enquanto trabalha no ISE, todas as variáveis ​​estarão disponíveis após a execução do script. Quando uso o ISE para construir meu script, sempre testarei com um console diferente do PowerShell aberto. Isso me permite ter certeza de que tudo funciona como pretendido.

informação relacionada