THEMA about_Scopes KURZBESCHREIBUNG Erklärt den Begriff des Bereichs in Windows PowerShell und zeigt, wie der Bereich von Elementen festgelegt oder geändert werden kann. DETAILBESCHREIBUNG Windows PowerShell schützt den Zugriff auf Variablen, Aliase, Funktionen und Windows PowerShell-Laufwerke (PSDrives), indem die Bereiche eingeschränkt werden, in denen diese Elemente gelesen oder geändert werden können. Windows PowerShell erzwingt einige wenige, einfache Bereichsregeln, um sicherzustellen, dass Elemente nicht ungewollt geändert werden. Für Bereiche gelten die folgenden Grundregeln: - Ein Element, das Sie in einen Bereich einschließen, ist in dem Bereich, in dem es erstellt wurde, und in untergeordneten Bereichen sichtbar, es sei denn, es wird explizit als privat (nicht öffentlich) definiert. Sie können Variablen, Aliase, Funktionen oder Windows PowerShell-Laufwerke in einem oder in mehreren Bereichen platzieren. - Ein Element, das Sie innerhalb eines Bereichs erstellt haben, kann nur in dem Bereich geändert werden, in dem es erstellt wurde, außer es wird explizit ein anderer Bereich angegeben. Wenn Sie in einem Bereich ein Element erstellen und der Name des Elements mit dem Namen eines Elements in einem anderen Bereich übereinstimmt, wird das ursprüngliche Element durch das neue Element ausgeblendet und ist nicht mehr zugänglich. Es wird jedoch nicht überschrieben oder geändert. Windows PowerShell-Bereiche Bereiche in Windows PowerShell haben sowohl Namen als auch Zahlen. Die benannten Bereiche geben einen absoluten Bereich an. Bei den Zahlen handelt es sich um relative Angaben, die die Beziehungen zwischen den Bereichen wiedergeben. Global: Der Bereich, der beim Start von Windows PowerShell gültig ist. Variablen und Funktionen, die bereits beim Start von Windows PowerShell verfügbar sind, werden im globalen Bereich erstellt. Dieser Bereich schließt die automatischen und die Einstellungsvariablen ein. Er beinhaltet auch die Variablen, Aliase und Funktionen aus Ihren Windows PowerShell-Profilen. Lokal: Der aktuelle Bereich. Sowohl der globale Bereich als auch jeder andere Bereich kann zu einem bestimmten Zeitpunkt den lokalen Bereich darstellen. Skript: Der Bereich, der erstellt wird, während eine Skriptdatei ausgeführt wird. Nur die Befehle innerhalb des Skripts werden im Skriptbereich ausgeführt. Für die Befehle in einem Skript stellt der Skriptbereich den lokalen Bereich dar. Privat: Elemente in einem privaten Bereich sind außerhalb des aktuel- len Bereichs nicht sichtbar. Sie können den privaten Bereich verwenden, um in einem anderen Bereich eine private Version eines Elements zu erstellen, das den gleichen Namen aufweist. Nummerierte Bereiche: Sie können auf einen Bereich über den Namen oder über einen Zahlenwert verweisen, der die Position eines Bereichs relativ zu einem anderen Bereich beschreibt. Bereich 0 stellt den aktuellen bzw. lokalen Bereich dar. Bereich 1 verweist auf den unmittelbar übergeordneten Bereich. Bereich 2 verweist auf den übergeordneten Bereich dieses übergeordneten Bereichs usw. Nummerierte Bereiche sind dann hilfreich, wenn Sie viele rekursive Bereiche erstellt haben. Übergeordnete und untergeordnete Bereiche Sie können durch das Ausführen eines Skripts oder einer Funktion, durch das Erstellen einer Sitzung oder durch das Starten einer neuen Instanz von Windows PowerShell einen neuen Bereich erstellen. Wenn Sie einen neuen Bereich erstellen, erhalten Sie einen übergeordneten Bereich (der ursprüngliche Bereich) und einen untergeordneten Bereich (der neu erstellte Bereich). In Windows PowerShell sind alle Bereiche untergeordnete Bereiche des globalen Bereichs, aber Sie können viele Bereiche und viele rekursive Bereiche erstellen. Sofern Sie Elemente nicht explizit als privat definieren, sind Elemente des übergeordneten Bereichs auch im untergeordneten Bereich verfügbar. Wenn Sie jedoch Elemente im untergeordneten Bereich erstellen und ändern, haben diese Elemente keinen Einfluss auf den übergeordneten Bereich, es sei denn, Sie geben beim Erstellen des Elements explizit einen Bereich an. Vererbung Ein untergeordneter Bereich erbt die Variablen, Aliase und Funktionen nicht vom übergeordneten Bereich. Sofern ein Element nicht als privat definiert ist, kann im untergeordneten Bereich auf das Element zugegriffen werden. Auch das Ändern eines Elements ist möglich, indem explizit der übergeordnete Bereich angegeben wird. Die Elemente sind jedoch nicht Teil des untergeordneten Bereichs. Ein untergeordneter Bereich wird mit einem bestimmten Satz von Elementen erstellt. In der Regel schließt er alle Aliase ein, die mit der Option "AllScope" angegeben wurden. Diese Option wird später in diesem Thema erläutert. Er schließt alle Variablen ein, für die die Option "AllScope" angegeben wurde, sowie einige Variablen, mit denen der Bereich angepasst werden kann, z. B. "MaximumFunctionCount". Zum Ermitteln der Elemente in einem bestimmten Bereich können Sie den Scope-Parameter von "Get-Variable" oder "Get-Alias" verwenden. Um z. B. alle Variablen im lokalen Bereich abzurufen, geben Sie Folgendes ein: get-variable -scope local Um alle Variablen im globalen Bereich abzurufen, geben Sie Folgendes ein: get-variable -scope global Bereichsmodifizierer Der Bereich einer neuen Variablen, eines Aliases oder einer Funktion kann mit einem Bereichsmodifizierer angegeben werden. Gültige Modifiziererwerte sind "Global" und "Script". Die Syntax zur Angabe eines Bereichsmodifizierers bei einer Variablen ist: $[<Bereichsmodifizierer>]:<Name> = <Wert> Die Syntax zur Angabe eines Bereichsmodifizierers bei einer Funktion ist: function [<Bereichsmodifizierer>]:<Name> {<Funktionstext>} Der Standardbereich für Skripts ist der Skriptbereich. Der Standardbereich für Funktionen und Aliase ist der lokale Bereich, auch wenn sie in einem Skript definiert werden. Der folgende Befehl, der keinen Bereichsmodifizierer verwendet, erstellt eine Variable im aktuellen bzw. im lokalen Bereich: $a = "eins" Um die gleiche Variable im globalen Bereich zu erstellen, verwenden Sie den Bereichsmodifizierer "Global": $global:a = "eins" Um die gleiche Variable im Skriptbereich zu erstellen, verwenden Sie den Bereichsmodifizierer "Script": $script:a = "eins" Sie können Bereichsmodifizierer auch in Funktionen verwenden. Die folgende Funktionsdefinition erstellt eine Funktion im globalen Bereich: function global:Hallo { write-host "Hallo, Welt" } Mithilfe von Bereichsmodifizierern können Sie auf Variablen in einem anderen Bereich verweisen. Der folgende Befehl verweist auf die Variable "$test", zuerst im lokalen Bereich und dann im globalen Bereich: $test $global:test Die Option "AllScope" Variablen und Aliase verfügen über eine Option-Eigenschaft, für die der Wert "AllScope" festgelegt werden kann. Elemente, für die die AllScope-Eigenschaft angegeben wurde, werden Teil jedes erstellten untergeordneten Bereichs. Umgekehrt erfolgt jedoch keine automatische Vererbung in übergeordnete Bereiche. Ein Element, das über die AllScope-Eigenschaft verfügt, ist im untergeordneten Bereich sichtbar und ist außerdem Teil dieses Bereichs. Änderungen an diesem Element in irgendeinem Bereich wirken sich auf alle Bereiche aus, in denen die Variable definiert ist. Verwalten von Bereichen Mehrere Cmdlets verfügen über einen Scope-Parameter, mit dem Sie Elemente in einem bestimmten Bereich abrufen und festlegen (erstellen und ändern) können. Verwenden Sie den folgenden Befehl, um alle Cmdlets in der Sitzung zu ermitteln, die über einen Scope-Parameter verfügen: get-help * -parameter scope Um alle Variablen zu ermitteln, die in einem bestimmten Bereich sichtbar sind, verwenden Sie den Scope-Parameter von "Get-Variable". Die sichtbaren Parameter schließen globale Parameter, Parameter im übergeordneten Bereich und Parameter des aktuellen Bereichs ein. Der folgende Befehl ruft z. B. die Variablen ab, die im lokalen Bereich sichtbar sind: get-variable -scope local Um eine Variable in einem bestimmten Bereich zu erstellen, verwenden Sie einen Bereichsmodifizierer oder den Scope-Parameter von "Set-Variable". Der folgende Befehl erstellt eine Variable im globalen Bereich: new-variable -scope global -name a -value "Eins" Sie können auch den Scope-Parameter der Cmdlets "New-Alias", "Set-Alias" oder "Get-Alias" verwenden, um den Bereich anzugeben. Der folgende Befehl erstellt einen Alias im globalen Bereich: new-alias -scope global -name np -value Notepad.exe Um die Funktionen in einem bestimmten Bereich abzurufen, verwenden Sie das Cmdlet "Get-Item", während Sie sich im gewünschten Bereich befinden. Das Cmdlet "Get-Item" verfügt nicht über einen Scope-Parameter. Verwenden der Punktquellnotation zur Bereichsangabe Skripts und Funktionen unterliegen ebenfalls den Bereichsregeln. Sie werden in einem bestimmten Bereich erstellt und beeinflussen nur diesen Bereich, sofern nicht mit einem Cmdlet-Parameter oder einen Bereichsmodifizierer explizit ein anderer Bereich angegeben wurde. Sie können ein Skript oder eine Funktion jedoch zum aktuellen Bereich hinzufügen, indem Sie die Punktquellnotation verwenden. Wenn das Skript dann im aktuellen Bereich ausgeführt wird, sind alle Funktionen, Aliase und Variablen, die das Skript erstellt, im aktuellen Bereich verfügbar. Um eine Funktion zum aktuellen Bereich hinzuzufügen, geben Sie im Funktionsaufruf einen Punkt (.) und ein Leerzeichen vor dem Pfad und Namen der Funktion ein. Um beispielsweise das Skript "Beispiel.ps1" im Verzeichnis "C:\Skripts" im Skriptbereich auszuführen (der Standard für Skripts), verwenden Sie den folgenden Befehl: c:\Skripts\Beispiel.ps1 Um das Skript "Beispiel.ps1" im lokalen Bereich auszuführen, verwenden Sie folgenden Befehl: . c:\Skripts.Beispiel.ps1 Wenn Sie eine Funktion oder ein Skript mit dem Aufrufoperator (&) ausführen, wird die Funktion bzw. das Skript nicht zum aktuellen Bereich hinzugefügt. Im folgenden Beispiel wird der Aufrufoperator verwendet: & c:\Skripts.Beispiel.ps1 Alle Aliase, Funktionen oder Variablen, die das Skript "Beispiel.ps1" erstellt, sind dabei im aktuellen Bereich nicht verfügbar. Einschränkungen außerhalb des Bereichskonzepts Einige Windows PowerShell-Konzepte ähneln Bereichsdefinitionen oder interagieren mit Bereichen. Diese Konzepte können ggf. als eigener Bereich oder als Bereichsverhalten missverstanden werden. Sitzungen, Module und geschachtelte Eingabeaufforderungen stellen in sich abgeschlossene Umgebungen dar, sie sind aber keine untergeordneten Bereiche des globalen Bereichs in der Sitzung. Sitzungen: Eine Sitzung ist eine Umgebung, in der Windows PowerShell ausgeführt wird. Wenn Sie eine Sitzung auf einem Remotecomputer erstellen, stellt Windows PowerShell eine dauerhafte Verbindung mit dem Remotecomputer her. Aufgrund der dauerhaften Verbindung können Sie die Sitzung für mehrere zusammenhängende Befehle verwenden. Da eine Sitzung eine in sich geschlossene Umgebung ist, verfügt sie auch über einen eigenen Bereich. Eine Sitzung ist jedoch kein untergeordneter Bereich der Sitzung, in der sie erstellt wurde. Die Sitzung startet mit einem eigenen globalen Bereich. Dieser Bereich ist vom globalen Bereich der Sitzung unabhängig. Sie können untergeordnete Bereiche in der Sitzung erstellen. Sie können z. B. ein Skript ausführen, wodurch in der Sitzung ein untergeordneter Bereich erstellt wird. Module: Sie können ein Windows PowerShell-Modul verwenden, um Windows PowerShell-Tools freizugeben und bereitzustellen. Ein Modul ist eine Einheit, die Cmdlets, Skripts, Funktionen, Variablen, Aliase und andere nützliche Elemente enthalten kann. Sofern dies nicht explizit anders definiert wurde, sind die Elemente in einem Modul außerhalb des Moduls nicht verfügbar. Deshalb können Sie das Modul zu einer Sitzung hinzufügen und die öffentlichen Elemente verwenden, ohne dass Gefahr besteht, dass die anderen Elemente die Cmdlets, Skripts, Funktionen und anderen Elemente in der Sitzung überschreiben. Diese private Einschränkung eines Moduls ähnelt einem Bereich, aber das Hinzufügen eines Moduls zu einer Sitzung ändert den Bereich nicht. Außerdem verfügen Module nicht über einen eigenen Bereich, obwohl die Skripts in einem Modul, wie alle Windows PowerShell-Skripts, in einem eigenen Bereich ausgeführt werden. Geschachtelte Eingabeaufforderungen: Auch geschachtelte Eingabeaufforderungen verfügen nicht über einen eigenen Bereich. Wenn Sie eine geschachtelte Eingabeaufforderung öffnen, ist die geschachtelte Eingabeaufforderung eine Untermenge der Umgebung. Aber, Sie bleiben innerhalb des lokalen Bereichs. Skripts haben ihren eigenen Bereich. Wenn Sie ein Skript debuggen und Sie einen Haltepunkt im Skript erreichen, arbeiten Sie innerhalb des Skriptbereichs. Option "Private": Aliase und Variablen verfügen über eine Option-Eigenschaft, für die der Wert "Private" festgelegt werden kann. Elemente, für die die Option "Private" angegeben wurde, können in dem Bereich angezeigt und geändert werden, in dem sie erstellt wurden. Außerhalb des Bereichs ist kein Zugriff auf diese Elemente möglich. Wenn Sie z. B. im globalen Bereich eine Variable mit der Option "Private" erstellen und dann ein Skript ausführen, wird die private Variable bei Get-Variable-Befehlen nicht angezeigt. Dies gilt auch, wenn Sie den Bereichsmodifizierer "Global" verwenden. Sie können den Option-Parameter der Cmdlets "New-Variable", "Set-Variable", "New-Alias" und "Set-Alias" verwenden, um für die Option-Eigenschaft den Wert "Private" festzulegen. Sichtbarkeit: Die Visibility-Eigenschaft einer Variablen oder eines Alias bestimmt, ob Sie das Element außerhalb seines Containers sehen können, z. B. außerhalb des Moduls, in dem das Element erstellt wurde. Die Sichtbarkeit erfüllt bei Containern dieselbe Funktion wie der Private-Wert der Option-Eigenschaft bei Bereichen. Die Visibility-Eigenschaft kann den Wert "Public" oder "Private" haben. Elemente mit der Sichtbarkeit "Private" können nur in dem Container angezeigt und geändert werden, in dem sie erstellt wurden. Wenn der Container hinzugefügt oder importiert wird, können Elemente mit der Sichtbarkeit "Private" nicht angezeigt oder geändert werden. Da die Sichtbarkeit für Container entworfen wurde, hat sie andere Auswirkungen auf die Verfügbarkeit innerhalb von Bereichen. Wenn Sie im globalen Bereich ein Element mit der Sichtbarkeit "Private" erstellen, kann das Element in keinem Bereich angezeigt oder geändert werden. Wenn Sie versuchen, den Wert einer Variablen anzuzeigen oder zu ändern, die mit der Sichtbarkeit "Private" definiert wurde, gibt Windows PowerShell eine Fehlermeldung zurück. Mit den Cmdlets "New-Variable" und "Set-Variable" können Sie eine Variable mit der Sichtbarkeit "Private" erstellen. BEISPIELE Beispiel 1: Ändern eines Variablenwerts ausschließlich in einem Skript Der folgende Befehl ändert den Wert der Variablen "$ConfirmPreference" in einem Skript. Die Änderung wirkt sich nicht auf den globalen Bereich aus. Verwenden Sie zunächst den folgenden Befehl, um den Wert der $ConfirmPreference-Variable im lokalen Bereich anzuzeigen: C:\PS> $ConfirmPreference High Erstellen Sie ein Skript "Bereich.ps1", das die folgenden Befehle enthält: $ConfirmPreference = "Low" "Der Wert von `$ConfirmPreference ist $ConfirmPreference." Führen Sie das Skript aus. Das Skript ändert den Wert der Variablen "$ConfirmPreference" und gibt anschließend den Wert im Skriptbereich aus. Die Ausgabe sollte folgendem Beispiel entsprechen: Der Wert von $ConfirmPreference ist Low. Testen Sie anschließend den aktuellen Wert der Variablen "$ConfirmPreference" im aktuellen Bereich. C:\PS> $ConfirmPreference High Dieses Beispiel zeigt, dass Änderungen eines Variablenwerts im Skriptbereich keinen Einfluss auf den Wert dieser Variablen im übergeordneten Bereich haben. Beispiel 2: Anzeigen eines Variablenwerts in unterschiedlichen Bereichen Mit Bereichsmodifizierern können Sie den Wert einer Variablen im lokalen und in einem übergeordneten Bereich anzeigen. Definieren Sie zuerst eine Variable "$test" im globalen Bereich. $test = "Global" Erstellen Sie danach ein Skript "Beispiel.ps1", das die Variable "$test" definiert. Verwenden Sie im Skript einen Bereichsmodifizierer, um auf die globale oder auf die lokale Version der Variablen "$test" zu verweisen. # In Beispiel.ps1 $test = "Local" "Der lokale Wert von `$test ist $test." "Der globale Wert von `$test ist $global:test." Wenn Sie "Beispiel.ps1" ausführen, sollten Sie folgende Ausgabe erhalten: Der lokale Wert von $test ist Local. Der globale Wert von $test ist Global. Nach der Ausführung des Skripts ist in der Sitzung nur der globale Wert von "$test" definiert. C:\PS> $test Global Beispiel 3: Ändern des Werts einer Variablen in einem übergeordneten Bereich Sofern ein Element nicht mit der Option "Private" oder einer anderen Methode geschützt wurde, können Sie den Wert einer Variablen in einem übergeordneten Bereich anzeigen und ändern. Definieren Sie zuerst eine Variable "$test" im globalen Bereich. $test = "Global" Erstellen Sie danach ein Skript "Beispiel.ps1", das die Variable "$test" definiert. Verwenden Sie im Skript einen Bereichsmodifizierer, um auf die globale oder auf die lokale Version der Variablen "$test" zu verweisen. # In Beispiel.ps1 $global:test = "Local" "Der globale Wert von `$test ist $global:test." Nach der Ausführung des Skripts hat sich der globale Wert von "$test" geändert. C:\PS> $test Local Beispiel 4: Erstellen einer privaten Variablen Eine private Variable ist eine Variable, für die in der Option-Eigenschaft der Wert "Private" angegeben wurde. Private Variablen werden vom untergeordneten Bereich geerbt, aber sie können nur in dem Bereich angezeigt oder geändert werden, in dem sie erstellt wurden. Der folgende Befehl erstellt im lokalen Bereich eine private Variable mit dem Namen "$ptest". new-variable -name ptest -value 1 -option private Sie können den Wert von "$ptest" im lokalen Bereich anzeigen und ändern. C:\PS> $ptest 1 C:\PS> $ptest = 2 C:\PS> $ptest 2 Erstellen Sie nun ein Skript "Beispiel.ps1", das die folgenden Befehle enthält. Der Befehl versucht, den Wert von "$ptest" anzuzeigen und zu ändern. # In Beispiel.ps1 "Der Wert von `$Ptest ist $Ptest." "Der Wert von `$Ptest ist $global:Ptest." Da die Variable "$ptest" im Skriptbereich nicht sichtbar ist, ist die Ausgabe leer. "Der Wert von $Ptest ist ." "Der Wert von $Ptest ist ." SIEHE AUCH about_Variables about_Environment_Variables about_Functions about_Script_Blocks