Pourquoi PowerShell ISE n'isole pas les variables de script dans la portée du script?

12

Dans PowerShell, la portée est censée empêcher les objets (variables, alias, fonctions, etc.) dans les scripts d'affecter l'environnement global. Cela semble fonctionner correctement sur la ligne de commande, mais pas dans l'ISE.

Voici une démonstration dans la console. Je vérifie que ce $xn'est pas défini dans la portée globale, affiche le contenu de ScopeTest.ps1, puis l'exécute, et enfin je vérifie si $xest à nouveau défini. Comme prévu, il $xn'est créé et utilisé que dans la portée du script et ne persiste pas dans l'environnement global une fois le script terminé.

entrez la description de l'image ici

Dans l'ISE, cela semble fonctionner si le script est appelé à l'aide de la fenêtre de console.

entrez la description de l'image ici

Cependant, si j'utilise réellement le bouton "Exécuter le script", ou F5, les variables dans le script persisteront une fois terminé.

entrez la description de l'image ici

Cela peut rendre l'écriture et le dépannage des scripts un peu difficiles, si le script suppose qu'il partira d'un environnement propre (c'est-à-dire: toutes les variables définies dans le script ne devraient pas déjà exister). Pourquoi l'ISE se comporte-t-il de cette façon?

Une réponse à cette question touche légèrement le sujet, mentionnant le "dot-sourcing", mais j'espère obtenir une explication plus approfondie ici. En outre, s'il existe une documentation expliquant pourquoi le script est exécuté différemment dans l'ISE que dans la console, une référence serait également intéressante.

Iszi
la source

Réponses:

9

Dans vos exemples de script, vous avez créé des variables et vous ne les avez pas détruites à la fin de votre script. L'ISE crée une instance en direct de PowerShell qui charge et exécute le script lorsque vous cliquez sur Exécuter. La différence est que le shell intégré peut continuer le script. C'est idéal pour déboguer l'environnement et pour créer des scripts au fur et à mesure. De cette façon, vous n'avez pas à exécuter votre script encore et encore (il y a des situations où cela ne serait pas idéal) pour vous assurer que la prochaine ligne de code fonctionne. Vous le tapez dans le shell, et si cela fonctionne, vous l'ajoutez à la section de script.

Ce comportement est peut-être mieux décrit ici: http://technet.microsoft.com/en-us/library/dd819480.aspx

Extrait pertinent:

Tous les volets dans ISE sont toujours dans la même portée.

Si vous ne voulez pas que vos variables vivent dans le shell une fois votre script terminé, vous devez les utiliser Remove-Variable.

Par exemple:

Remove-Variable x

Vous pouvez ajouter une instance "propre" de PowerShell à l'ISE en cliquant sur Fichier-> Nouvel onglet PowerShell

Colyn1337
la source
2

Dans l'ISE, Powershell vide essentiellement le script dans le shell, puis l'exécute. Comme si vous l'aviez tapé dans le shell, puis exécuté. La variable est donc disponible pour cette session. Pour voir d'autres différences, consultez ce post MSDN .

Non financé
la source
Je ne vois rien dans le post lié concernant ce comportement.
Iszi
0

donc l'ISE est Scoped as Global. Sauf si vous supprimez toutes les variables créées pendant que vous travaillez dans l'ISE, toutes les variables seront disponibles après l'exécution du script. Lorsque j'utilise l'ISE pour créer mon script, je teste toujours avec une autre console PowerShell ouverte. Cela me permet de m'assurer que tout fonctionne comme prévu.

TechGuyTJ
la source