PowerShell-Leitfaden für Variablenbereiche: Verwenden von Bereichen in Skripts und Modulen

PowerShell

PowerShell-Variablenbereich Hero-Banner

PowerShell verwendet Variablen, um Informationen zu speichern, die später gebraucht werden. Mit Variablen lassen sich auch einfach Werte an mehreren Stellen ändern, indem man die Definition der Variable ändert. Sie können Informationen wie Namen, Pfade und die Ausgaben von Befehlen in einer Variablen speichern.

Während Sie an Erfahrung mit PowerShell gewinnen, wird das Konzept der Variablenbereiche vermutlich ab einem bestimmten Punkt eine Rolle beim Schreiben von Skripts, Funktionen und Modulen spielen. In diesem Beitrag gehe ich auf die Grundlagen des PowerShell-Variablenbereichs ein und biete Beispiele für die Verwendung von Bereichen in PowerShell-Skripts und -Modulen.

Holen Sie sich den kostenlosen Grundlagen-Videokurs für PowerShell und Active Directory.

Ich würde ihn sowohl für neue als auch für fortgeschrittene PowerShell-Benutzer empfehlen. Ein AD-Tool zu erstellen ist ein sehr nützlicher Lernprozess.

Zusätzlich zu den Bereichen sollten Sie sich auch unsere Sammlung von PowerShell-Tools für weitere Ressourcen wie Editoren, Module und Schulungen anschauen. Damit können Sie Ihre PowerShell-Fähigkeiten auf das nächste Level bringen.

Was sind PowerShell-Bereiche?

Der PowerShell-Bereich schützt Variablen und andere Artefakte, indem er einschränkt, wo sie gelesen und geändert werden können. Bereichsebenen schützen Elemente, die nicht geändert werden sollten. PowerShell verfügt über die folgenden Bereiche:

  • Global: Dieser Bereich ist verfügbar, wenn Sie eine PowerShell-Konsole öffnen oder einen neuen Runspace bzw. eine neue Sitzung erstellen. Die automatischen und Einstellungsvariablen von PowerShell sind im globalen Bereich verfügbar. Alle Variablen, Aliasse und Funktionen, die in Ihrem PowerShell-Profil definiert sind, sind auch im globalen Bereich verfügbar.
  • Script: Dies ist der Bereich, der erstellt wird, wenn Sie ein Skript ausführen. Im Skript definierte Variablen sind nur für den Skriptbereich und nicht für den globalen oder übergeordneten Bereich verfügbar.
  • Local: Dies ist der aktuelle Bereich, in dem ein Befehl oder Skript gerade ausgeführt wird. Zum Beispiel werden Variablen, die in einem Skriptbereich definiert sind, als dessen lokaler Bereich betrachtet.
  • Private: Obwohl es sich technisch gesehen nicht um einen Bereich handelt, kann die Verwendung von „Privat“ die Sichtbarkeit einer Variablen außerhalb des Bereichs, in dem die Variable definiert ist, schützen.

Bereiche arbeiten in einer Hierarchie, d. h. global ist der übergeordnete Bereich. Variablen, die im globalen Bereich definiert sind, stehen dem untergeordneten Bereich automatisch zum Abruf zur Verfügung. Im untergeordneten Bereich definierte Variablen sind jedoch nicht für den übergeordneten Bereich verfügbar.

Die Bereichsfunktionen in PowerShell folgen einigen grundlegenden Regeln:

  • Bereiche sind ineinander verschachtelt. Der äußere Bereich ist der übergeordnete Bereich, und alle verschachtelten Bereiche sind untergeordnete Bereiche dieses übergeordneten Bereichs.
  • Ein Element ist in dem Bereich verfügbar, in dem es definiert ist, und für alle untergeordneten Bereiche, sofern es nicht ausdrücklich als privat eingestellt wird.
  • Ein in einem Bereich erstelltes Element kann nur in dem Bereich geändert werden, in dem es definiert wurde. Ein anderes Element mit demselben Namen in einem anderen Bereich kann das ursprüngliche Element ausblenden, es aber nicht überschreiben oder verändern.

Globaler Bereich und Skriptbereich

Schauen wir uns einige Beispiele für verschiedene Bereiche in Aktion an. Ich habe ein Skript, das eine Variable definiert und auf dem Bildschirm ausgibt:

  1. $greeting = “Hello, World!”
  2. $greeting

Dieses Skript definiert die Variable $greeting im Bereich des Skripts (oder lokal). Diese Variable und ihr Wert stehen der PowerShell-Konsole, also dem übergeordneten Bereich, jedoch nicht zur Verfügung. Schauen Sie sich hier die Ausgabe der PowerShell-Befehle an:

Globaler Bereich und Skriptbereich

Ich zeige den aktuellen Wert der Variablen $greeting in der Konsole (oder im globalen Bereich) an, und wie erwartet ist sie leer. Ich führe die Skriptdatei aus, in der $greeting definiert ist und auf dem Bildschirm ausgegeben wird. Nachdem das Skript beendet wurde, zeige ich den Wert von $greeting erneut in der PowerShell-Konsole an, und er ist immer noch leer. Dieses Verhalten ist zu erwarten, da sich die Variable $greeting im untergeordneten Skriptbereich und nicht im übergeordneten globalen Bereich befindet.

Betrachten wir nun den umgekehrten Fall. Anstatt den Wert von $greeting im Skript zu definieren, definieren wir ihn im globalen Bereich. Das Skript zeigt dann den Wert der Variablen $greeting innerhalb des Skripts an, da es ihn aus dem globalen Bereich geerbt hat.

Vom globalen Bereich geerbte Variable

Innerhalb des Skripts habe ich die Variable $greeting nicht festgelegt oder verändert. Ich habe nur ihren Wert angezeigt. Der greeting-String wurde aus der Konsole als übergeordnetem Bereich an die Skriptdatei als untergeordneten Bereich vererbt.

Bereichsmodifikatoren verwenden

In den vorherigen Beispielen sehen wir, wie eine im untergeordneten Skriptbereich definierte Variable dem globalen Bereich nicht als Referenz zur Verfügung stand. Wir können jedoch Bereichsmodifikatoren verwenden, um den Bereich der definierten Variable zu ändern. Einige Bereichsmodifikatoren sind:

 

Bereichsmodifikator Nutzung
global: Die Variable existiert im globalen Bereich
local: Die Variable existiert im lokalen Bereich
private: Die Variable ist nur im aktuellen Bereich sichtbar
script: Die Variable existiert im Skriptbereich, d. h. im Bereich der nächstgelegenen Skriptdatei, oder im Bereich „Global“, wenn keiner verfügbar ist

 

Ich kann beispielsweise das Präfix $global: für eine Variable in einem Skript verwenden, um einen Variablenwert zu ändern, den ich bereits im globalen übergeordneten Bereich definiert habe. Schauen Sie sich das Skript und die Konsolenausgabe unten an:

Bereichsmodifikatoren verwenden

Ich habe die Variable $greeting im globalen Konsolenbereich als “Hello, Jeff!” definiert. Anschließend habe ich die Skriptdatei ausgeführt, die den Wert mithilfe des Bereichsmodifikators $global: “Hello, World!” neu zugewiesen hat. Nach der Ausführung des Skripts wurde der Wert von $greeting im globalen Konsolenbereich auf den Wert des Skripts geändert.

Verwenden von Bereichen in einem PowerShell-Modul

Ein PowerShell-Modul ist ein Paket von Befehlen, z. B. cmdlets oder Funktionen, die ähnliche Funktionen oder Zwecke haben. Ein Beispiel dafür ist das Modul ActiveDirectory für Windows PowerShell, das Befehle zum Verwalten von Active-Directory-Objekten enthält.

Sie können ein Modul selbst erstellen und müssen möglicherweise in verschiedenen Funktionen auf dieselbe Variable verweisen. Durch das Festlegen von Variablen im Skriptbereich in einem Modul sind die Variablen nun für die Funktionen des Moduls gemeinsam nutzbar.

Hier ist eine Beispieldatei des PowerShell-Moduls (MyModule.psm1), die zwei Funktionen enthält: Get-Greeting und Set-Greeting:

function Get-Greeting {
if ($name) {
$greeting = "Hello, $name!"
}
else {
$greeting = "Hello, World!"
}


$greeting
}


function Set-GreetingName {
param(
[Parameter(Mandatory)]
[string]
$GreetingName
)


$name = $GreetingName
}

 

Beachten Sie, dass beide Funktionen auf die Variable $name verweisen. Da ich die Variable jedoch in separaten Funktionen definiert habe, gilt ihr Bereich nur für diese Funktion. Das Festlegen der Variablen $name in der Funktion Set-GreetingName hat keinen Einfluss auf die Variable $name in Get-Greeting. Sie können das selbst ausprobieren, indem Sie diesen Code in einer .psm1-Datei speichern, ihn mit dem Befehl Import-Module importieren und den Dateinamen des Moduls referenzieren.

Variable ist im Bereich der Funktion

Obwohl ich die Variable $name mit der Funktion Set-GreetingName festgelegt habe, hat das keine Auswirkungen auf die Variable $name in der Funktion Get-Greeting . Jede Variable $name ist durch ihren Bereich auf ihre eigene Funktion beschränkt. Wenn ich den Wert in einer Funktion ändere, wirkt sich das nicht auf die andere Funktion aus.

Wenn die Variable für alle Funktionen im Modul verfügbar sein soll, füge ich folgendermaßen den Modifikator $script: zur Variable $name hinzu:

function Get-Greeting {
if ($script:name) {
$greeting = "Hello, $script:name!"
}
else {
$greeting = "Hello, World!"
}


$greeting
}


function Set-GreetingName {
param(
[Parameter(Mandatory)]
[string]
$GreetingName
)


$script:name = $GreetingName
}

Wenn ich das Modul mit dem Parameter -Force erneut importiere, kann ich nun den Wert von $name in einer Funktion festlegen und ihn in einer anderen referenzieren.

Variable ist im Bereich des Moduls

Beachten Sie, dass der Aufruf von Get-Greeting die Standardnachricht anzeigt, da die Variable $script:name keinen Wert hatte. Nach dem Aufruf der Funktion Set-GreetingName zeigt die Funktion Get-Greeting nun einen anderen Wert an, gemäß dem Namen, den ich übergeben habe. Dieses Verhalten ist zu erwarten, da beide Funktionen nun auf dieselbe Variable verweisen.

Das Beispielmodul ist zwar einfach, aber daran lässt sich der praktische Nutzen von Bereichen erkennen. Ich verwende diese Funktionen, um API-Anmeldedaten einzustellen, die mehrere Funktionen in von mir geschriebenen Modulen verwenden. Ein Beispiel dafür finden Sie in meinem GitHub-Repository twilio-powershell-module.

Bereichseinstellung mit Dot-Source-Notation

Wie ich in den obigen Beispielen gezeigt habe, haben Skripts und Funktionen ihren eigenen Bereich außerhalb des globalen Bereichs. Änderungen an Variablen sind nur in diesem Bereich gültig, es sei denn, Sie verwenden einen Bereichsmodifikator, um den Bereich der Variablen zu ändern.

Sie können jedoch den Bereich eines Skripts oder einer Funktion integrieren, indem Sie die Dot-Source-Notation verwenden. Wenn das Skript im aktuellen Bereich ausgeführt wird, sind alle Skriptvariablen im aktuellen Bereich verfügbar. Sie können die Dot-Source-Notation verwenden, indem Sie einen Punkt (.) und ein Leerzeichen vor den Skriptnamen setzen. Schauen Sie sich die Skriptdatei und den Code unten an:

Verwenden der Dot-Source-Notation

Zunächst ist der Wert von $greeting im globalen Konsolenbereich leer bzw null, und die Datei scopetest.ps1 legt den Wert von $greeting fest. Durch die Verwendung der Dot-Source-Notation bringt das Skript den Variablenwert in den übergeordneten Bereich. Sie können auch den Aufruf-Operator/das Et-Zeichen (&) verwenden, um ein Skript oder eine Funktion auszuführen, ohne dass der Bereich zum aktuellen Bereich hinzugefügt wird.

Weitere Ressourcen

Ein gutes Verständnis von Bereichen in PowerShell ist beim Schreiben von Skripts, Modulen und Funktionen unerlässlich. Beispielsweise können Sie in eine Situation kommen, in der eine Variable einen unerwarteten Wert hat, weil sie ihn von einem anderen Bereich geerbt hat. Die Verwendung anderer Techniken, beispielsweise die Arbeit mit Bereichen auf Modulebene und Dot-Source-Notation, kann Ihnen helfen, wertvolle PowerShell-Tools für Ihren Werkzeugkasten zu erstellen.

Weitere Informationen zum Schreiben von PowerShell-Skripts finden Sie in Jeff Petters Windows PowerShell Scripting-Tutorial für Anfänger.

Jeff Brown

Jeff Brown

Jeff Brown is a cloud engineer specializing in Microsoft technologies such as Office 365, Teams, Azure, and PowerShell.

 

Möchten Sie Varonis in Aktion erleben?

Vereinbaren Sie eine Demo oder wenden Sie sich an unseren Vertrieb unter +49 89 3803 7990