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 $x
nicht im globalen Bereich definiert ist, zeige den Inhalt von ScopeTest.ps1
und führe ihn dann aus. Zuletzt überprüfe ich, ob $x
es erneut definiert ist. Wird wie erwartet $x
nur im Rahmen des Skripts erstellt und verwendet und bleibt nach dem Beenden des Skripts nicht in der globalen Umgebung erhalten.
In der ISE scheint dies zu funktionieren, wenn das Skript über das Konsolenfenster aufgerufen wird.
Wenn ich jedoch die Schaltfläche "Skript ausführen" oder F5 verwende, bleiben die Variablen innerhalb des Skripts nach Abschluss bestehen.
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.
quelle
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.
quelle