¿Por qué el ISE de PowerShell no aísla las variables de script en el alcance del script?

12

En PowerShell, se supone que el alcance evita que los objetos (variables, alias, funciones, etc.) en los scripts afecten el entorno global. Esto parece funcionar bien en la línea de comando, pero no en el ISE.

Aquí hay una demostración en la consola. Verifico que $xno está definido en el ámbito global, muestro el contenido ScopeTest.ps1y luego lo ejecuto, y finalmente verifico si $xestá definido nuevamente. Como se esperaba, $xsolo se crea y utiliza dentro del alcance del script y no persiste en el entorno global después de que el script haya finalizado.

ingrese la descripción de la imagen aquí

En el ISE, esto parece funcionar si se llama al script usando la ventana de la consola.

ingrese la descripción de la imagen aquí

Sin embargo, si realmente uso el botón "Ejecutar script", o F5, las variables dentro del script persistirán después de que se complete.

ingrese la descripción de la imagen aquí

Esto puede dificultar un poco la escritura y la resolución de problemas de los scripts, si el script supone que comenzará desde un entorno limpio (es decir: cualquier variable establecida dentro del script no debería existir). ¿Por qué el ISE se comporta de esta manera?

Una respuesta a esta pregunta toca el tema un poco, mencionando el "abastecimiento de puntos", pero espero obtener una explicación más completa aquí. Además, si existe documentación sobre por qué el script se ejecuta de manera diferente en el ISE que desde la consola, una referencia también sería buena.

Iszi
fuente

Respuestas:

9

En sus ejemplos de script, creó variables y no las destruyó al final de su script. El ISE crea una instancia en vivo de powershell que carga y ejecuta el script cuando hace clic en ejecutar. La diferencia es que el shell integrado puede continuar el script. Esto es ideal para depurar el entorno y crear scripts sobre la marcha. De esta manera, no tiene que seguir ejecutando su script una y otra vez (hay situaciones en las que esto no sería lo ideal) para asegurarse de que la siguiente línea de código funcionó. Lo escribe en el shell y, si funciona, lo agrega a la sección de secuencia de comandos.

Quizás este comportamiento se describa mejor aquí: http://technet.microsoft.com/en-us/library/dd819480.aspx

Extracto relevante:

Todos los paneles en ISE están siempre en el mismo alcance.

Si no desea que sus variables vivan en el shell después de que su script se haya completado, entonces debería hacerlo Remove-Variable.

Por ejemplo:

Remove-Variable x

Puede agregar una instancia "limpia" de powershell al ISE haciendo clic en Archivo-> Nueva pestaña de Powershell

Colyn1337
fuente
2

En el ISE, Powershell esencialmente descarga el script al shell y luego lo ejecuta. Como si lo hubiera escrito en el shell y luego lo hubiera ejecutado. Entonces la variable está disponible para esa sesión. Para ver otras diferencias, mira esta publicación de MSDN .

Nuez sin fondos
fuente
No veo nada en la publicación vinculada que aborde este comportamiento.
Iszi
0

por lo que el ISE tiene el alcance global. A menos que elimine todas las variables creadas mientras trabaja en el ISE, todas las variables estarán disponibles después de que se ejecute el script. Cuando uso el ISE para construir mi script, siempre probaré con una consola PowerShell diferente abierta. Esto me permite asegurarme de que todo funcione como estaba previsto.

TechGuyTJ
fuente