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.

Iszi
fonte

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

Colyn1337
fonte
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 .

Unfundednut
fonte
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.

TechGuyTJ
fonte