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 $x
n'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 $x
est à nouveau défini. Comme prévu, il $x
n'est créé et utilisé que dans la portée du script et ne persiste pas dans l'environnement global une fois le script terminé.
Dans l'ISE, cela semble fonctionner si le script est appelé à l'aide de la fenêtre de console.
Cependant, si j'utilise réellement le bouton "Exécuter le script", ou F5, les variables dans le script persisteront une fois terminé.
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.
la source
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.
la source