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

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

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 alcance global, muestro el contenido ScopeTest.ps1y luego lo ejecuto y, por último, verifico si $xestá definido nuevamente. Como era de esperar, $xsolo se crea y utiliza dentro del alcance del script y no persiste en el entorno global una vez finalizado el script.

ingrese la descripción de la imagen aquí

En ISE, esto parece funcionar si se llama al script mediante 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 una vez completado.

ingrese la descripción de la imagen aquí

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

una respuesta aesta preguntatoca el tema ligeramente, mencionando el "punto de abastecimiento", pero espero obtener una explicación más completa aquí. Además, si existe documentación que explique por qué el script se ejecuta de manera diferente en ISE que desde la consola, una referencia también sería buena.

Respuesta1

En sus ejemplos de secuencia de comandos, creó variables y no las destruyó al final de su secuencia de comandos. El ISE crea una instancia activa 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 tendrá que seguir ejecutando su script una y otra vez (hay situaciones en las que esto no sería ideal) para asegurarse de que la siguiente línea de código funcione. Lo escribes en el shell y, si funciona, lo agregas a la sección de script.

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

Extracto relevante:

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

Si no desea que sus variables vivan en el shell después de que se haya completado el script, 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.

Respuesta2

En ISE, Powershell consiste esencialmente en volcar el script al shell y luego ejecutarlo. Como si lo hubieras escrito en el shell y luego lo hubieras ejecutado. Entonces la variable está disponible para esa sesión. Para ver otras diferencias, mira estoMSDNcorreo.

Respuesta3

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

información relacionada