Warum isoliert die PowerShell ISE Skriptvariablen nicht auf den Skriptbereich?

Warum isoliert die PowerShell ISE Skriptvariablen nicht auf den Skriptbereich?

In PowerShell soll die Bereichsdefinition verhindern, dass Objekte (Variablen, Aliase, Funktionen usw.) in Skripten die globale Umgebung beeinflussen. Dies scheint in der Befehlszeile einwandfrei zu funktionieren, in der ISE jedoch nicht.

Hier ist eine Demonstration in der Konsole. Ich überprüfe, ob $xnicht im globalen Bereich definiert ist, zeige den Inhalt an ScopeTest.ps1und führe es dann aus. Zuletzt überprüfe ich, ob $xerneut definiert ist. Wie erwartet $xwird nur im Rahmen des Skripts erstellt und verwendet und bleibt nach Beendigung des Skripts nicht in der globalen Umgebung bestehen.

Bildbeschreibung hier eingeben

In der ISE scheint dies zu funktionieren, wenn das Skript über das Konsolenfenster aufgerufen wird.

Bildbeschreibung hier eingeben

Wenn ich jedoch tatsächlich die Schaltfläche „Skript ausführen“ oder F5 verwende, bleiben die Variablen im Skript nach dessen Abschluss bestehen.

Bildbeschreibung hier eingeben

Dies kann das Schreiben und die Fehlerbehebung bei Skripten etwas erschweren, wenn das Skript davon ausgeht, dass es in einer sauberen Umgebung gestartet wird (d. h.: Im Skript festgelegte Variablen sollten noch nicht vorhanden sein.) Warum verhält sich die ISE auf diese Weise?

Eine Antwort aufdiese Fragestreift das Thema nur kurz und erwähnt „Dot-Sourcing“, aber ich hoffe, hier eine ausführlichere Erklärung zu erhalten. Wenn außerdem eine Dokumentation darüber existiert, warum das Skript in der ISE anders ausgeführt wird als von der Konsole aus, wäre eine Referenz ebenfalls nett.

Antwort1

In Ihren Skriptbeispielen haben Sie Variablen erstellt und diese am Ende Ihres Skripts nicht zerstört. Die ISE erstellt eine Live-Instanz von Powershell, die das Skript lädt und ausführt, wenn Sie auf „Ausführen“ klicken. Der Unterschied besteht darin, dass die integrierte Shell das Skript fortsetzen kann. Dies ist ideal zum Debuggen der Umgebung und zum Erstellen von Skripten während der Arbeit. Auf diese Weise müssen Sie Ihr Skript nicht immer wieder ausführen (es gibt Situationen, in denen dies nicht ideal wäre), um sicherzustellen, dass die nächste Codezeile funktioniert hat. Sie geben es in die Shell ein und wenn es funktioniert, fügen Sie es dem Skriptabschnitt hinzu.

Dieses Verhalten lässt sich hier vielleicht am besten beschreiben: http://technet.microsoft.com/en-us/library/dd819480.aspx

Relevanter Auszug:

Alle Bereiche in ISE befinden sich immer im selben Bereich.

Wenn Sie nicht möchten, dass Ihre Variablen nach Abschluss Ihres Skripts in der Shell verbleiben, sollten Sie Remove-Variabledies tun.

Zum Beispiel:

Remove-Variable x

Sie können der ISE eine "saubere" Instanz von Powershell hinzufügen, indem Sie auf Datei->Neue Registerkarte Powershell klicken.

Antwort2

In der ISE übergibt Powershell das Skript im Wesentlichen an die Shell und führt es dann aus. Als ob Sie es in der Shell eingegeben und dann ausgeführt hätten. Die Variable ist also für diese Sitzung verfügbar. Weitere Unterschiede finden Sie hierMSDNPost.

Antwort3

Die ISE hat also einen globalen Gültigkeitsbereich. Sofern Sie nicht alle Variablen entfernen, die während der Arbeit in der ISE erstellt wurden, sind alle Variablen nach der Ausführung des Skripts verfügbar. Wenn ich die ISE zum Erstellen meines Skripts verwende, teste ich immer mit einer anderen geöffneten PowerShell-Konsole. So kann ich sicherstellen, dass alles wie beabsichtigt funktioniert.

verwandte Informationen