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 $x
não está definido no escopo global, mostro o conteúdo ScopeTest.ps1
e depois executo e, por último, verifico se $x
está definido novamente. Como esperado, $x
só é criado e usado dentro do escopo do script e não persiste no ambiente global após o término do script.
No ISE, isso parece funcionar se o script for chamado usando a janela do console.
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.
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.