2010-12-09 3 views
16

Existe-t-il une commande qui efface les variables de session PowerShell actuelles que j'ai ajoutées? J'utilise le commandlet Add-Type et j'obtiens l'erreur "Impossible d'ajouter un type, le nom du type existe déjà."clear powerhell session

Répondre

7

Malheureusement, vous ne pouvez pas décharger les assemblys .NET qui ont été chargés dans l'AppDomain par défaut, ce que fait le type Add-Type. Vous pouvez renommer des types ou des espaces de noms afin de les faire flotter, mais à un moment donné, il vous suffit de quitter et de redémarrer PowerShell.

Il ne s'agit pas d'une limitation PowerShell, mais d'une limitation .NET/CLR. Vous pouvez charger des assemblys .NET dans des AppDomains distincts qui peuvent être déchargés plus tard, mais vous devrez les coder vous-même et cela impose des restrictions sur les types que vous prévoyez d'utiliser dans le domaine AppDomain distinct. Autrement dit, ces types doivent fonctionner via .NET Remoting, de sorte qu'ils doivent dériver de MarshByRefObject ou qu'ils doivent être sérialisables (et cela s'applique à tous les objets référencés par leurs propriétés, et ainsi de suite dans le graphe d'objets).

+4

Mais existe-t-il une commande pour réinitialiser votre session PowerShell? – Agzam

+0

Il n'existe aucun moyen de décharger les assemblys ajoutés via Add-Type. Vous devez redémarrer PowerShell. Vous pouvez charger les assemblys via Add-Type et faire des expérimentations avec ces types en utilisant des jobs d'arrière-plan (Start-Job). Chaque travail génère une nouvelle instance PowerShell qui disparaît lorsque ce travail est terminé. –

+0

Mais qu'en est-il si vous avez du code C# en ligne dans le script? Cela rend le débogage du script douloureux – Agzam

6

Un possible « travail autour »: Ouvrez une fenêtre de Powershell, puis d'exécuter votre script entrer powershell .\yourScriptHere.ps1

Cette lance une nouvelle instance qui sort lorsque powershell votre script sort. Si vous voulez "jouer" dans la nouvelle instance, changez l'invocation en powershell -NoExit .\yourScriptHere.ps1 et la nouvelle instance ne se terminera pas à la fin du script. Entrez exit lorsque vous avez besoin d'un autre redémarrage et appuyez sur la touche "flèche vers le haut" pour obtenir la commande précédente. Toutes les sorties de script apparaîtront dans la même fenêtre. Le temps de démarrage d'une nouvelle instance de PowerShell est faible: il semble être inférieur à 1 seconde sur mon ordinateur portable.