about_Scopes

Letzte Aktualisierung: Mai 2014

Betrifft: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

THEMA

about_Scopes

KURZE BESCHREIBUNG

Erläutert das Konzept des Bereichs in Windows PowerShell® und zeigt, wie der Bereich der Elemente festgelegt und geändert werden kann.

LANGE BESCHREIBUNG

Windows PowerShell schützt den Zugriff auf Variablen, Aliase, Funktionen und Windows PowerShell-Laufwerke (PSDrives) durch Beschränkung, wo diese gelesen und geändert werden können. Durch die Durchsetzung einiger weniger Regeln für den Bereich stellt Windows PowerShell sicher, dass nicht versehentlich ein Element geändert wird, das nicht geändert werden soll.

Das Folgende sind die grundlegenden Regeln des Bereichs:

  • – Ein Element, das Sie in einen Bereich platzieren, ist in dem Bereich sichtbar, in dem es erstellt wurde, sowie in jedem untergeordneten Bereich, außer wenn Sie es explizit als privat deklarieren. Sie können Variablen, Aliase, Funktionen oder Windows PowerShell-Laufwerke in einen oder mehrere Bereiche platzieren.

  • – Ein Element, das Sie innerhalb eines Bereichs erstellt haben, kann nur in den Bereich geändert werden, in dem es erstellt wurde, außer wenn Sie explizit einen anderen Bereich angeben.

Wenn Sie ein Element in einem Bereich erstellen und das Element denselben Namen hat wie ein Element in einem anderen Bereich, wird das ursprüngliche Element möglicherweise unter dem neuen Element verborgen. Es wird jedoch nicht überschrieben oder geändert.

WINDOWS POWERSHELL-BEREICHE

Die Bereiche in Windows PowerShell verfügen sowohl über Namen als auch Nummern. Die benannten Bereiche geben einen absoluten Bereich an. Die Zahlen sind relativ und widerspiegeln die Beziehung zwischen Bereichen.

  • Global:
    Der Bereich, der beim Start von Windows PowerShell gilt. Variablen und Funktionen, die beim Start von Windows PowerShell vorhanden sind, wurden im globalen Gültigkeitsbereich erstellt. Dazu zählen automatische Variablen und Voreinstellungsvariablen. Außerdem gehören dazu die Variablen, Aliase und Funktionen, die sich in Ihrem Windows PowerShell-Profil befinden.
  • Lokal:
    Der aktuelle Bereich. Der lokale Bereich kann der globale Bereich oder jeder andere Bereich sein.
  • Skript:
    Der Bereich, der erstellt wird, während eine Skriptdatei ausgeführt wird. In dem Skriptbereich werden nur die Befehle in dem Skript ausgeführt. Für die Befehle in einem Skript ist der Skriptbereich der lokale Bereich.
  • Privat:
    Elemente im privaten Bereich können außerhalb des aktuellen Bereichs nicht angezeigt werden. Sie können den privaten Bereich verwenden, um eine private Version eines Elements mit dem gleichen Namen in einem anderen Bereich zu erstellen.
  • Nummerierte Bereiche:
    Zum Verweisen auf Bereiche können Sie deren Namen oder eine Nummer verwenden. Diese Nummer beschreibt die relative Position von einem Bereich zu einem anderen. Bereich 0 repräsentiert dabei den aktuellen oder lokalen Bereich. Bereich 1 gibt den unmittelbar übergeordneten Bereich an. Bereich 2 gibt den übergeordneten Bereich des übergeordneten Bereichs an und so weiter. Nummerierte Bereiche sind nützlich, wenn Sie viele rekursive Bereiche erstellt haben.

ÜBERGEORDNETE UND UNTERGEORDNETE BEREICHE

Sie können einen neuen Bereich erstellen, indem Sie ein Skript oder eine Funktion ausführen, indem Sie eine Sitzung erstellen oder indem Sie eine neue Instanz von Windows PowerShell starten. Wenn Sie einen neuen Bereich erstellen, ist das Ergebnis ein übergeordneter Bereich (der ursprüngliche Bereich) und ein untergeordneten Bereich (der Bereich, den Sie erstellt haben).

In Windows PowerShell sind alle Bereiche untergeordnete Bereiche des globalen Bereichs, Sie können jedoch beliebig viele Bereiche und rekursive Bereiche erstellen.

Außer wenn Sie die Elemente explizit als privat deklarieren, sind die Elemente im übergeordneten Bereich für den untergeordneten Bereich verfügbar. Allerdings haben Elemente, die Sie im untergeordneten Bereich erstellen und ändern, keine Auswirkung auf den übergeordneten Bereich, außer wenn Sie den Bereich beim Erstellen der Elemente explizit angeben.

VERERBUNG

Ein untergeordneten Bereich erbt nicht die Variablen, Aliase und Funktionen vom übergeordneten Bereich. Außer wenn ein Element privat ist, kann der untergeordnete Bereich die Elemente im übergeordneten Bereich anzeigen. Und er kann die Elemente ändern, indem der übergeordnete Bereich explizit angegeben wird. Die Elemente sind aber keine Bestandteile des untergeordneten Bereichs.

Ein untergeordneten Bereich wird jedoch mit einem Satz von Elementen erstellt. Normalerweise umfasst dieser Satz alle Aliase, die die AllScope-Option aufweisen. Diese Option wird weiter unten in diesem Thema erläutert. Das schließt alle Variablen ein, die die AllScope-Option aufweisen, sowie einige Variablen, die verwendet werden können, um den Bereich anzupassen, z. B. MaximumFunctionCount.

Um die Elemente in einem bestimmten Bereich zu finden, verwenden Sie den Scope-Parameter von Get-Variable oder Get-Alias.

Um beispielsweise alle Variablen im lokalen Bereich zu erhalten, geben Sie Folgendes ein:

        get-variable -scope local

Um alle Variablen im globalen Bereich zu erhalten, geben Sie Folgendes ein:

        get-variable -scope global

BEREICHSMODIFIZIERER

Um den Bereich von neuen Variablen, Aliasen oder Funktionen anzugeben, verwenden Sie einen Bereichsmodifizierer. Die gültigen Werte für einen Modifizierer sind Global, Local, Private und Script.

Die Syntax für einen Bereichsmodifizierer in einer Variablen ist:

        $[<scope-modifier>]:<name> = <value>

Die Syntax für einen Bereichsmodifizierer in einer Funktion ist:

        function [<scope-modifier>]:<name> {<function-body>}

Der Standardbereich für Skripts ist der Skriptbereich. Der Standardbereich für Funktionen und Aliase ist der lokale Gültigkeitsbereich, selbst wenn sie in einem Skript definiert sind.

Der folgende Befehl, bei dem kein Bereichsmodifizierer verwendet wird, erstellt eine Variable im aktuellen oder im lokalen Bereich:

       $a = "one"

Um dieselbe Variable im globalen Bereich zu erstellen, verwenden Sie den Global-Bereichsmodifizierer:

       $global:a = "one"

Um dieselbe Variable im Skriptbereich zu erstellen, verwenden Sie den Script-Bereichsmodifizierer:

       $script:a = "one"

Sie können auch einen Bereichsmodifizierer in Funktionen verwenden. Die folgende Funktionsdefinition erstellt eine Funktion im globalen Bereich:

       function global:Hello
       {
    write-host "Hello, World"
       }

Sie können auch Bereichsmodifizierer verwenden, um auf eine Variable in einem anderen Bereich zu verweisen. Der folgende Befehl verweist auf die $test-Variable, zunächst im lokalen Bereich und dann im globalen Bereich:

      $test

      $global:test

DER USING-BEREICHSMODIFIZIERER

„Using“ ist ein spezieller Bereichsmodifizierer, der eine lokale Variable in einem Remote-Befehl identifiziert. Standardmäßig wird bei Remote-Befehlen davon ausgegangen, dass sie in der Remote-Sitzung definiert sind.

Der Using-Bereichsmodifizierer wurde mit Windows PowerShell 3.0 eingeführt.

Weitere Informationen finden Sie unter „about_Remote_Variables“.

DIE ALLSCOPE-OPTION

Variablen und Aliase haben eine Option-Eigenschaft, die den Wert AllScope annehmen kann. Elemente, die die AllScope-Eigenschaft aufweisen, werden zu Bestandteilen jedes von Ihnen erstellten untergeordneten Bereichs, obwohl sie nicht rückwirkend von übergeordneten Bereichen geerbt werden.

Ein Element, das über die AllScope-Eigenschaft verfügt, ist im untergeordneten Bereich sichtbar und ist Bestandteil dieses Bereichs. Änderungen am Element in einem beliebigen Bereich wirken sich auf die Bereiche aus, in denen die Variable definiert ist.

VERWALTEN DES BEREICHS

Mehrere Cmdlets verfügen über einen Scope-Parameter, mit dem Sie Elemente in einem bestimmten Bereich abrufen oder festlegen (erstellen und ändern) können. Verwenden Sie folgenden Befehl, um alle Cmdlets in Ihrer Sitzung zu finden, die über einen Scope-Parameter verfügen:

         get-help * -parameter scope

Um die Variablen zu suchen, die in einem bestimmten Bereich sichtbar sind, verwenden Sie den Scope-Parameter von Get-Variable. Die sichtbaren Parameter umfassen globale Parameter, Parameter im übergeordneten Bereich und Parameter im aktuellen Bereich.Abschnittstext hier einfügen.

Der folgende Befehl ruft beispielsweise 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 "One"

Sie können auch den Scope-Parameter der New-Alias-, Set-Alias- oder Get-Alias-Cmdlets 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 zu erhalten, verwenden Sie das Get-Item-Cmdlet, wenn Sie sich in dem Bereich befinden. Das Get-Item-Cmdlet besitzt keinen Scope-Parameter.

VERWENDEN DER DOT-SOURCE-NOTATION MIT BEREICH

Skripte und Funktionen folgen alle den Regeln des Bereichs. Sie erstellen diese in einem bestimmten Bereich, und sie wirken sich nur auf diesen Bereich aus, außer wenn Sie einen Cmdlet-Parameter oder einen Bereichsmodifizierer verwenden, um diesen Bereich zu ändern.

Sie können dem aktuellen Bereich aber auch ein Skript oder eine Funktion hinzufügen, indem Sie die Dot-Source-Notation verwenden. Wenn dann ein Skript in dem aktuellen Bereich ausgeführt wird, stehen alle Funktionen, Aliase und Variablen, die das Skript erstellt, im aktuellen Bereich zur Verfügung.

Um eine Funktion zum aktuellen Bereich hinzuzufügen, geben Sie einen Punkt (.) und ein Leerzeichen vor dem Pfad und Namen der Funktion im Funktionsaufruf ein.

Um z. B. das Sample.ps1-Skript aus dem Verzeichnis „C:\Scripts“ im Skriptbereich (die Standardeinstellung für Skripts) auszuführen, verwenden Sie den folgenden Befehl:

        c:\scripts\sample.ps1

Um das Sample.ps1-Skript im lokalen Bereich auszuführen, verwenden Sie den folgenden Befehl:

        . c:\scripts.sample.ps1

Bei Verwendung des Aufrufoperators (&), um eine Funktion oder ein Skript ausführen, wird dieser nicht zum aktuellen Bereich hinzugefügt. Beim folgenden Beispiel wird der Aufrufoperator verwendet:

        & c:\scripts.sample.ps1

Alle Aliase, Funktionen oder Variablen, die das Sample.ps1-Skript erstellt, sind im aktuellen Bereich nicht verfügbar.

EINSCHRÄNKEN OHNE BEREICH

Einige wenige Windows PowerShell-Konzepte ähneln dem Bereich oder interagieren mit dem Bereich. Diese Konzepte können möglicherweise mit dem Bereich oder dem Verhalten des Bereichs verwechselt werden.

Sitzungen, Module und geschachtelte Abfragen sind eigenständige Umgebungen, aber sie sind 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 Remote-Computer erstellen, stellt Windows PowerShell dauerhafte Verbindung mit dem Remote-Computer her. Dank dieser dauerhaften Verbindung können Sie die Sitzung für mehrere verwandte Befehle verwenden.

    Da eine Sitzung eine eigenständige Umgebung ist, hat sie ihren eigenen Bereich, aber eine Sitzung ist kein untergeordneter Bereich der Sitzung, in der sie erstellt wurde. Die Sitzung wird mit ihrem eigenen globalen Bereich gestartet. Dieser Bereich ist unabhängig vom globalen Bereich der Sitzung. Sie können untergeordnete Bereiche in der Sitzung erstellen. Beispielsweise können Sie ein Skript ausführen, um einen untergeordneten Bereich in einer Sitzung zu erstellen.

  • Module:
    Sie können ein Windows PowerShell-Modul zum Freigeben und Übermitteln von Windows PowerShell-Tools verwenden. Ein Modul ist eine Einheit, die Cmdlets, Skripts, Funktionen, Variablen, Aliase und andere nützliche Elemente enthalten kann. Sofern nicht explizit definiert, kann auf die Elemente in einem Modul nicht von außerhalb des Moduls zugegriffen werden. Daher können Sie das Modul zu Ihrer Sitzung hinzufügen und die öffentlichen Elemente verwenden, ohne sich Sorgen machen zu müssen, dass die anderen Elemente die Cmdlets, Skripts, Funktionen und andere Elemente in der Sitzung überschreiben könnten.

    Der Datenschutz eines Moduls verhält sich wie ein Bereich, doch das Hinzufügen eines Moduls zu einer Sitzung ändert nicht den Bereich. Und das Modul hat keinen eigenen Bereich, obwohl die Skripts im Modul – wie alle Windows PowerShell-Skripts – ihren eigenen Bereich haben.

  • Geschachtelte Abfragen:
    In gleicher Weise haben auch geschachtelte Abfragen keinen eigenen Bereich. Wenn Sie eine geschachtelte Abfrage eingeben, ist die verschachtelte Abfrage eine Teilmenge der Umgebung. Aber Sie bleiben im lokalen Bereich.

    Skripts haben ihren eigenen Bereich. Wenn Sie ein Skript debuggen und einen Haltepunkt in dem Skript erreichen, gelangen Sie in den Skriptbereich.

  • Private-Option:
    Aliase und Variablen haben eine Option-Eigenschaft, die den Wert Private annehmen kann. Elemente mit der Private-Option können in dem Bereich angezeigt und geändert werden, in dem sie erstellt wurden, außerhalb dieses Bereichs können sie jedoch nicht angezeigt oder geändert werden.

    Wenn Sie z. B. im globalen Bereich eine Variable erstellen, die über eine Private-Option verfügt, und dann ein Skript ausführen, zeigen Get-Variable-Befehle in dem Skript nicht die Private-Variable an. Dies tritt selbst dann auf, wenn Sie den globalen Bereichsmodifizierer verwenden.

    Sie können den Option-Parameter der New-Variable-, Set-Variable-, New-Alias- und Set-Alias-Cmdlets verwenden, um den Wert der Option-Eigenschaft auf „Private“ festzulegen.

  • Visibility:
    Die Visibility-Eigenschaft einer Variablen oder eines Alias bestimmt, ob Sie das Element außerhalb des Containers (z. B. eines Moduls), in dem es erstellt wurde, sehen können. Visibility ist für Container in gleicher Weise vorgesehen, wie der Private-Wert der Option-Eigenschaft für Bereiche vorgesehen ist.

    Die Visibility-Eigenschaft wird mit den Werten Public und Private angegeben. Elemente, bei denen die Visibility-Eigenschaft den Private-Wert hat, können nur in dem Container angezeigt und geändert werden, in denen sie erstellt wurden. Wenn der Container hinzugefügt oder importiert wird, können die Elemente mit dem Visibility-Wert Private nicht angezeigt oder geändert werden.

    Da die Visibility-Eigenschaft für Container vorgesehen ist, funktioniert sie in einem Bereich anders. Wenn Sie im globalen Bereich ein Element erstellen, das den Visibility-Wert Private hat, können Sie das Element nicht in einem beliebigen Bereich anzeigen oder ändern. Wenn Sie versuchen, den Wert einer Variablen mit dem Visibility-Wert Private anzuzeigen oder zu ändern, gibt Windows PowerShell eine Fehlermeldung zurück.

    Sie können die New-Variable- und Set-Variable-Cmdlets verwenden, um eine Variable zu erstellen, die den Visibility-Wert Private hat.

BEISPIELE

Beispiel 1: Ändern nur eines Variablenwerts in einem Skript

Der folgende Befehl ändert den Wert der $ConfirmPreference-Variablen in einem Skript. Die Änderung wirkt sich nicht auf den globalen Bereich aus.

Verwenden Sie zunächst zum Anzeigen des Werts der $ConfirmPreference-Variablen im lokalen Gültigkeitsbereich den folgenden Befehl:

          C:\PS> $ConfirmPreference
          High

Erstellen Sie ein Scope.ps1-Skript, das die folgenden Befehle enthält:

          $ConfirmPreference = "Low"
          "The value of `$ConfirmPreference is $ConfirmPreference."

Führen Sie das Skript aus. Das Skript ändert den Wert der $ConfirmPreference-Variablen und meldet dann deren Wert in den Skriptbereich. Die Ausgabe entspricht in etwa der folgenden Ausgabe:

          The value of $ConfirmPreference is Low.

Anschließend testen Sie den aktuellen Wert der $ConfirmPreference-Variablen im aktuellen Bereich.

          C:\PS> $ConfirmPreference
          High

Dieses Beispiel zeigt, dass Änderungen am Wert einer Variablen im Skriptbereich keine Auswirkungen auf den Wert dieser Variablen im übergeordneten Bereich haben.

Beispiel 2: Anzeigen eines Variablenwerts in verschiedenen Bereichen

Sie können Bereichsmodifizierer verwenden, um den Wert einer Variablen im lokalen Bereich und in einem übergeordneten Bereich anzuzeigen.

Definieren Sie zunächst eine $test-Variable im globalen Bereich.

        $test = "Global"

Erstellen sie danach ein Sample.ps1-Skript, das die $test-Variable definiert. Verwenden Sie in dem Skript einen Bereichsmodifizierer, um entweder auf die globalen oder lokalen Versionen der $test-Variablen zu verweisen.Abschnittstext hier einfügen.

          # In Sample.ps1

          $test = "Local"
          "The local value of `$test is $test."
          "The global value of `$test is $global:test."

Beim Ausführen von Sample.ps1 sollte die Ausgabe der folgenden Ausgabe ähneln:

          The local value of $test is Local.
          The global value of $test is Global.

Wenn das Skript abgeschlossen ist, wurde nur der globale Wert von $test in der Sitzung definiert.

          C:\PS> $test
          Global

Beispiel 3: Ändern des Werts einer Variable in einem übergeordneten Bereich

Außer wenn Sie ein Element durch Verwendung der Private-Option oder eine andere Methode schützen, können Sie den Wert einer Variablen in einem übergeordneten Bereich anzeigen und ändern.

Definieren Sie zunächst eine $test-Variable im globalen Bereich.

        $test = "Global"

Erstellen sie danach ein Sample.ps1-Skript, das die $test-Variable definiert. Verwenden Sie in dem Skript einen Bereichsmodifizierer, um entweder auf die globale oder lokale Version der $test-Variablen zu verweisen.

          # In Sample.ps1

          $global:test = "Local"
          "The global value of `$test is $global:test."

Wenn das Skript abgeschlossen ist, wurde der globale Wert von $test geändert.

          C:\PS> $test
          Local

Beispiel 4: Erstellen eine Private-Variablen

Eine Private-Variable ist eine Variable, die über eine Option-Eigenschaft verfügt, die den Wert „Private“ hat. 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 eine Private-Variable namens $ptest im lokalen Bereich.

        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 dann ein Sample.ps1-Skript, das die folgenden Befehle enthält. Der Befehl versucht, den Wert von $ptest anzuzeigen und zu ändern.

          # In Sample.ps1

          "The value of `$Ptest is $Ptest."
          "The value of `$Ptest is $global:Ptest."

Da die $ptest-Variable im Skriptbereich nicht sichtbar ist, ist die Ausgabe leer.

          "The value of $Ptest is ."
          "The value of $Ptest is ."

Beispiel 5: Verwenden einer Local-Variablen in einem Remote-Befehl

Um anzugeben, dass eine Variable in einem Remote-Befehl in der lokalen Sitzung erstellt wurde, verwenden Sie den Using-Bereichsmodifizierer. Standardmäßig geht Windows PowerShell davon aus, dass die Variablen in Remote-Befehlen in der Remote-Sitzung erstellt wurden.

Die Syntax lautet:

           $Using:<VariableName>

Beispielsweise erstellen die folgenden Befehle eine $Cred-Variable in der lokalen Sitzung und verwenden dann die $Cred-Variable in einem Remote-Befehl:

           $Cred = Get-Credential
           Invoke-Command $s {Remove-Item .\Test*.ps1 -Credential $Using:Cred}

Der Using-Bereich wurde in Windows PowerShell 3.0 eingeführt.

Um in Windows PowerShell 2.0 anzugeben, dass eine Variable in der lokalen Sitzung verstellt wurde, verwenden Sie das folgende Befehlsformat:

           $Cred = Get-Credential
           Invoke-Command $s {param($c) Remove-Item .\Test*.ps1 -Credential $c} -ArgumentList $Cred

SIEHE AUCH

about_Variables

about_Environment_Variables

about_Functions

about_Script_Blocks