about_Scopes

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