Warum isoliert PowerShell ISE Skriptvariablen nicht für den Skriptbereich?

12

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

Hier ist eine Demonstration in der Konsole. Ich überprüfe, ob dies $xnicht im globalen Bereich definiert ist, zeige den Inhalt von ScopeTest.ps1und führe ihn dann aus. Zuletzt überprüfe ich, ob $xes erneut definiert ist. Wird wie erwartet $xnur im Rahmen des Skripts erstellt und verwendet und bleibt nach dem Beenden des Skripts nicht in der globalen Umgebung erhalten.

Bildbeschreibung hier eingeben

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

Bildbeschreibung hier eingeben

Wenn ich jedoch die Schaltfläche "Skript ausführen" oder F5 verwende, bleiben die Variablen innerhalb des Skripts nach Abschluss bestehen.

Bildbeschreibung hier eingeben

Dies kann das Schreiben und Behandeln von Problemen mit Skripten etwas erschweren, wenn das Skript davon ausgeht, dass es in einer sauberen Umgebung gestartet wird (z. B .: Alle im Skript gesetzten Variablen sollten noch nicht vorhanden sein.). Warum verhält sich die ISE so?

Die Beantwortung dieser Frage berührt das Thema nur geringfügig und erwähnt "Dot-Sourcing", aber ich hoffe, hier eine genauere Erklärung zu erhalten. Wenn Dokumentation darüber vorhanden ist, warum das Skript in der ISE anders ausgeführt wird als in der Konsole, wäre auch ein Verweis hilfreich.

Iszi
quelle

Antworten:

9

In Ihren Skriptbeispielen haben Sie Variablen erstellt und sie 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. 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. Sie geben es in die Shell ein und wenn es funktioniert, fügen Sie es dem Skriptabschnitt hinzu.

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

Relevanter Auszug:

Alle Bereiche in ISE sind immer im gleichen Bereich.

Wenn Sie nicht möchten, dass Ihre Variablen nach Abschluss Ihres Skripts in der Shell gespeichert werden, sollten Sie Remove-Variablesie verwenden.

Beispielsweise:

Remove-Variable x

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

Colyn1337
quelle
2

In der ISE-PowerShell wird das Skript im Wesentlichen in die Shell geschrieben und dann ausgeführt. Als ob Sie es in die Shell eingegeben und dann ausgeführt hätten. Die Variable ist also für diese Sitzung verfügbar. Weitere Unterschiede finden Sie in diesem MSDN- Beitrag.

Nicht finanzierte Nuss
quelle
Ich sehe nichts in dem verlinkten Post, der dieses Verhalten anspricht.
Iszi
0

Daher wird die ISE als global eingestuft. Sofern Sie nicht alle Variablen entfernen, die während der Arbeit in der ISE erstellt wurden, sind alle Variablen nach Ausführung des Skripts verfügbar. Wenn ich mein Skript mit ISE erstelle, teste ich immer mit einer anderen PowerShell-Konsole. Auf diese Weise kann ich sicherstellen, dass alles wie beabsichtigt funktioniert.

TechGuyTJ
quelle