In Batchskripts wirken sich Änderungen an Umgebungsvariablen standardmäßig auf die aktuelle Sitzung aus. Bei PowerShell ist das genaue Gegenteil der Fall, da Bereiche verwendet werden, um die Änderungen eines Skripts zu isolieren. Hier werden wir untersuchen, wie Bereiche PowerShell-Skripte beeinflussen und in und um sie herum arbeiten.
In PowerShell bezieht sich ein "Bereich" auf die aktuelle Umgebung, in der ein Skript oder eine Befehls-Shell ist in Betrieb. Bereiche werden verwendet, um bestimmte Objekte in der Umgebung vor unbeabsichtigten Änderungen durch Skripts oder Funktionen zu schützen. Insbesondere sind die folgenden Dinge vor Änderungen durch Befehle geschützt, die von einem anderen Bereich ausgeführt werden, sofern in diesen Befehlen nichts anderes angegeben ist:
Neue Bereiche Sie werden immer dann erstellt, wenn Sie ein Skript oder eine Funktion ausführen oder wenn Sie eine neue Sitzung oder Instanz von PowerShell erstellen. Bereiche, die durch Ausführen von Skripten und Funktionen erstellt werden, haben eine "Eltern / Kind" -Beziehung mit dem Bereich, aus dem sie erstellt wurden. Es gibt einige Bereiche, die eine besondere Bedeutung haben und über den Namen aufgerufen werden können:
Auf Bereiche kann in bestimmten Befehlen auch durch Nummer Bezug genommen werden, wobei der aktuelle Bereich als Null bezeichnet wird und seine Vorfahren durch steigende Ganzzahlen referenziert werden. In einem Skript, das vom globalen Gültigkeitsbereich ausgeführt wird, wäre der Skriptbereich beispielsweise 0 und der globale Gültigkeitsbereich 1. Ein Bereich, der im Skriptbereich weiter verschachtelt ist, z. B. eine Funktion, würde sich auf den globalen Gültigkeitsbereich als 2 beziehen Negative Zahlen funktionieren nicht, um auf untergeordnete Bereiche zu verweisen - der Grund dafür wird in Kürze ersichtlich sein.
Wie bereits erwähnt, wirken sich Befehle, die innerhalb eines Bereichs ausgeführt werden, nicht auf Objekte in einem anderen Bereich aus um es zu tun. Wenn beispielsweise $ MyVar im globalen Bereich vorhanden ist und ein Skript einen Befehl ausführt, um $ MyVar auf einen anderen Wert zu setzen, bleibt die globale Version von $ MyVar unverändert, während eine Kopie von $ MyVar im Skriptbereich mit dem neuen Bereich platziert wird Wert. Wenn ein $ MyVar nicht vorhanden ist, erstellt ein Skript es standardmäßig im Skriptbereich - nicht im globalen Bereich. Dies ist wichtig, wenn Sie sich an die tatsächliche Eltern / Kind-Beziehung zwischen Bereichen erinnern.
Die Eltern / Kind-Beziehung von Bereichen in der PowerShell ist unidirektional. Befehle können den aktuellen Bereich, seinen übergeordneten Bereich und alle Bereiche darüber anzeigen und optional ändern. Sie können jedoch keine Objekte in untergeordneten Elementen des aktuellen Bereichs anzeigen oder ändern. Dies liegt vor allem daran, dass der untergeordnete Bereich bereits zerstört wurde, nachdem er in einen übergeordneten Bereich verschoben wurde, da er seinen Zweck erfüllt hat. Warum müssen Sie beispielsweise eine Variable im Bereich "Skript" im Bereich "Global" anzeigen oder ändern, nachdem das Skript beendet wurde? Es gibt viele Fälle, in denen Sie die Änderungen eines Skripts oder einer Funktion über die Fertigstellung hinaus beibehalten müssen, aber nicht so viele, dass Sie vor oder nach der Ausführung Änderungen an Objekten im Gültigkeitsbereich des Skripts oder der Funktion vornehmen müssen. (Normalerweise werden solche Dinge als Teil des Skripts oder der Funktion selbst behandelt.)
Was sind Regeln ohne Ausnahmen? Eine Ausnahme zu den oben genannten sind private Bereiche. Objekte in den privaten Bereichen sind nur für Befehle verfügbar, die in dem Bereich ausgeführt werden, aus dem sie erstellt wurden. Eine weitere wichtige Ausnahme sind Elemente mit der AllScope-Eigenschaft. Dies sind spezielle Variablen und Aliase, bei denen eine Änderung in einem beliebigen Bereich alle Bereiche betrifft. Die folgenden Befehle zeigen Ihnen, welche Variablen und Aliase die AllScope-Eigenschaft haben:
Get-Variable | Where-Objekt {$ _. Options -match 'AllScope'} Get-Alias | Where-Objekt {$ _. Options -match 'AllScope')
Für den ersten Blick auf Bereiche in Aktion starten wir in einer PowerShell-Sitzung, in der die Variable $ MyVar gesetzt wurde zu einer Zeichenfolge "Ich bin eine globale Variable!" von der Befehlszeile aus. Dann wird das folgende Skript aus einer Datei namens Scope-Demo.ps1 ausgeführt:
Function FunctionScope {'$ MyVar mit einer Funktion ändern.' $ MyVar = 'Ich wurde von einer Funktion gesetzt!' "MyVar sagt $ MyVar"} "Aktuellen Wert von $ MyVar überprüfen." "MyVar sagt $ MyVar" "Ändern von $ MyVar nach Skript." $ MyVar = 'Ich wurde von einem Skript gesetzt!' "MyVar sagt $ MyVar" "FunctionScope" Überprüfung des endgültigen Werts von MyVar vor dem Beenden des Skripts. ' "MyVar sagt $ MyVar" "
Wenn PowerShell-Skripte genauso funktionieren wie Batch-Skripte, würden wir erwarten, dass der Wert von $ MyVar (oder% MyVar% in Stapelsyntax) von" Ich bin eine globale Variable! " zu 'Ich wurde von einem Drehbuch festgelegt!' und schließlich zu 'Ich wurde von einer Funktion gesetzt!' Sie sehen, was tatsächlich passiert, wenn wir uns durch die verschiedenen Bereiche bewegen - insbesondere nachdem die FunctionScope-Funktion ihre Arbeit beendet hat und wir die Variable erneut aus dem Skript überprüfen und später der Global-Bereich.
Wie Sie sehen können, hat sich die Variable geändert, als wir uns durch das Skript bewegten, da wir bis zum Abschluss der FunctionScope-Funktion die Variable aus dem gleichen Gültigkeitsbereich wie zuletzt überprüft haben Nachdem FunctionScope ausgeführt wurde, sind wir wieder in den Skript-Bereich zurückgekehrt, wo $ MyVar von der Funktion unberührt gelassen wurde. Als das Skript beendet wurde, sind wir wieder in den globalen Bereich zurückgekehrt, wo es überhaupt nicht geändert wurde.
Das ist also gut und schön, damit Sie nicht versehentlich Änderungen an der Umgebung vornehmen, die über Ihre Skripts und Funktionen hinausgehen, aber was ist, wenn Sie tatsächlich solche Änderungen vornehmen möchten? ationen? Es gibt eine spezielle und ziemlich einfache Syntax zum Erstellen und Ändern von Objekten über den lokalen Bereich hinaus. Sie fügen den Namen des Bereichs einfach an den Anfang des Variablennamens und einen Doppelpunkt zwischen den Namen des Bereichs und der Variablen ein. So:
$ global: MyVar $ -Skript: MyVar $ local: MyVar
Sie können diese Modifikatoren sowohl beim Anzeigen als auch beim Einstellen von Variablen verwenden. Schauen wir uns an, was mit diesem Demoskript passiert:
Function FunctionScope {"$ MyVar im lokalen Funktionsumfang ändern ... '$ local: MyVar =" Dies ist MyVar im lokalen Bereich der Funktion.' '$ MyVar im Skriptbereich ändern ... '$ script: MyVar =' MyVar wurde von einem Skript festgelegt. Jetzt durch eine Funktion gesetzt. "$ MyVar im globalen Bereich ändern ... '$ global: MyVar =' MeineVar wurde im globalen Bereich gesetzt. Jetzt durch eine Funktion gesetzt. "Überprüfen von $ MyVar in jedem Bereich ... '" Lokal: $ local: MyVar " Skript: $ script: MyVar " Global: $ global: MyVar "} "Aktueller Wert von $ MyVar.' "MyVar sagt $ MyVar" "Ändern von $ MyVar nach Skript." $ MyVar = 'Ich wurde von einem Skript gesetzt!' "MyVar sagt $ MyVar" FunctionScope 'Überprüfen von $ MyVar aus dem Skriptbereich vor dem Beenden.' "MyVar sagt $ MyVar" "
Wie zuvor beginnen wir damit, die Variable im Bereich Global zu setzen und das Ergebnis des globalen Bereichs zu überprüfen.
Hier sehen Sie, dass FunctionScope die Variable ändern konnte Im Skriptbereich bleiben die Änderungen auch nach dem Abschluss erhalten, und die Änderung der Variablen im Bereich "Global" blieb auch nach dem Beenden des Skripts bestehen. Dies kann besonders nützlich sein, wenn Variablen innerhalb eines Skripts wiederholt geändert werden müssen oder im globalen Gültigkeitsbereich unter Verwendung des gleichen Codes - Sie definieren einfach eine Funktion oder ein Skript, das geschrieben wird, um die Variable zu ändern, wo und wie sie benötigt wird, und rufen diese auf, wenn diese Änderungen notwendig sind.
Bereichsnummern können auch in bestimmten Befehlen verwendet werden, um die Variable auf verschiedenen Ebenen in Bezug auf den lokalen Bereich zu modifizieren.Hier ist das gleiche Skript wie im zweiten Beispiel oben, jedoch mit der modifizierten Funktion für die Befehle Get-Variable und Set-Variable mit dem Umfang num bers, anstatt die Variable mit den angegebenen Bereichen direkt zu referenzieren:
FunctionScope {"Ändern von $ MyVar in Scope 0, relativ zu FunctionScope ... 'Set-Variable MyVar" Dies ist MyVar im Funktionsumfang 0. "-Scope 0' Ändern von $ MyVar in Scope 1, relativ zu FunctionScope ... 'Set-Variable MyVar 'MyVar wurde in Scope 1 von einer Funktion geändert.' -Scope 1 'Ändern von $ MyVar in Scope 2, relativ zu Functionscope ...' Set-Variable MyVar 'MeineVar wurde in Scope 2 geändert, von einer Funktion.' -Scope 2 "Überprüfung von $ MyVar in jedem Bereich ..." Scope 0: 'Get-Variable MyVar -Scope 0 -ValueOnly' Scope 1: 'Get-Variable MyVar -Scope 1 -ValueOnly' Scope 2: 'Get-Variable MyVar-Scope 2 -ValueOnly "}" Aktuellen Wert von $ MyVar erhalten. ' "MyVar sagt $ MyVar" "Ändern von $ MyVar nach Skript." $ MyVar = 'Ich wurde von einem Skript gesetzt!' "MyVar sagt $ MyVar" FunctionScope 'Überprüfen von $ MyVar aus dem Skriptbereich vor dem Beenden.' "MyVar sagt $ MyVar" "
Ähnlich wie zuvor können wir hier sehen, wie Befehle in einem Bereich Objekte im übergeordneten Bereich ändern können.
Es gibt noch viel mehr mit Bereichen als Diese Bereiche betreffen mehr als nur Variablen, und es gibt noch weitere Informationen zu den privaten Bereichen und den AllScope-Variablen.Weitere nützliche Informationen erhalten Sie, wenn Sie den folgenden Befehl in PowerShell ausführen:
Get-Help about_scopes
Dieselbe Hilfedatei ist auch auf TechNet verfügbar.
Geltungsbereich Bildnachweis: spadassin on openclipart
Externe Festplatte, die nicht in Windows oder OS X angezeigt wird?
Mac oder Windows-Computer erkennt Ihre externe Festplatte oder das Flash-Laufwerk nicht? Dies ist ein häufiges Problem, insbesondere beim Anschluss von Festplatten zwischen Mac OS X, Windows und Linux. Es kann auch auf einem einzelnen System passieren, wo es für lange Zeit einwandfrei funktionierte und dann plötzlich vom Betriebssystem nicht mehr erkannt wird.Ma
Finden Sie heraus, ob zwei Zellen in Excel genau die gleichen Zahlenwerte enthalten
Wie eine zweidimensionale (oder flache) Datenbank ist Excel in der Lage, viele verschiedene Arten von Daten von kleinen Geschäftskontakten bis zu persönlichen Einkommensteuerdatensätzen zu speichern. In beiden Beispielen ist Genauigkeit wichtig, um sicherzustellen, dass Sie die Informationen haben, die Sie benötigen, wenn Sie sie benötigen.In j