2010-12-09 8 views
16

Gibt es ein Commandlet, das die aktuellen Powershell-Sitzungsvariablen löscht, die ich hinzugefügt habe?Powershell-Sitzung löschen

Ich verwende das Add-Type-Kommando, und ich bekomme den Fehler "Kann den Typ nicht hinzufügen. Der Typ Name existiert bereits."

Antwort

7

Leider können Sie .NET-Assemblies, die in die Standard-AppDomain geladen wurden, nicht entladen, was Add-Type tut. Sie können Typen oder Namespaces umbenennen, um mitzuhalten, aber irgendwann müssen Sie PowerShell beenden und neu starten.

Dies ist keine PowerShell-Einschränkung, sondern eine .NET/CLR-Einschränkung. Sie können .NET-Assemblys in separate Anwendungsdomänen laden, die später entladen werden können. Sie müssten dies jedoch selbst programmieren. Dadurch werden die Typen eingeschränkt, die Sie in der separaten Anwendungsdomäne verwenden möchten. Das heißt, diese Typen müssen über .NET Remoting arbeiten, sodass sie entweder von MarshByRefObject abgeleitet werden müssen oder serialisierbar sein müssen (und dies gilt für alle Objekte, auf die von ihren Eigenschaften verwiesen wird, usw. in der Objektgrafik).

+4

Gibt es einen Befehl zum Zurücksetzen der Powershell-Sitzung? – Agzam

+0

Es gibt keine Möglichkeit, Baugruppen zu entfernen, die über Add-Type hinzugefügt wurden. Sie müssen PowerShell neu starten. Sie können die Assemblys über Add-Type laden und mit diesen Typen experimentieren, indem Sie Hintergrundjobs (Start-Job) verwenden. Bei jedem Job wird eine neue PowerShell-Instanz gestartet, die nach Abschluss dieses Jobs nicht mehr verfügbar ist. –

+0

Aber was ist, wenn Sie Inline-C# -Code im Skript haben? Es macht das Debuggen des Skripts schmerzhaft – Agzam

6

Eine mögliche „work around“: ein Powershell-Fenster öffnen und dann das Skript ausführen eingeben powershell .\yourScriptHere.ps1

Dies startet eine neue Powershell-Instanz, die austritt, wenn Ihr Skript beendet. Wenn Sie in der neuen Instanz "spielen" möchten, ändern Sie den Aufruf in powershell -NoExit .\yourScriptHere.ps1 und die neue Instanz wird nicht beendet, wenn das Skript abgeschlossen ist. Geben Sie ein, wenn Sie einen weiteren Neustart benötigen, und drücken Sie die "Pfeil nach oben" -Taste, um den vorherigen Befehl zu erhalten. Alle Skriptausgaben erscheinen im selben Fenster. Der Overhead für das Starten einer neuen Powershell-Instanz ist niedrig - scheint auf meinem Laptop weniger als 1 Sekunde zu betragen.