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

PowerShell-Variablenbereiche können beim Schreiben von Skripts und Funktionen für Verwirrung sorgen. Dieser Beitrag behandelt PowerShell-Bereiche in Hinblick auf Skripts und Module.
Jeff Brown
6 minute gelesen
Letzte aktualisierung 28. Oktober 2021

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:

  1. function Get-Greeting {
  2. if ($name) {
  3. $greeting = "Hello, $name!"
  4. }
  5. else {
  6. $greeting = "Hello, World!"
  7. }
  8. $greeting
  9. }
  10. function Set-GreetingName {
  11. param(
  12. [Parameter(Mandatory)]
  13. [string]
  14. $GreetingName
  15. )
  16. $name = $GreetingName
  17. }
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:

  1. function Get-Greeting {
  2. if ($script:name) {
  3. $greeting = "Hello, $script:name!"
  4. }
  5. else {
  6. $greeting = "Hello, World!"
  7. }
  8. $greeting
  9. }
  10. function Set-GreetingName {
  11. param(
  12. [Parameter(Mandatory)]
  13. [string]
  14. $GreetingName
  15. )
  16. $script:name = $GreetingName
  17. }
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.

Wie soll ich vorgehen?

Im Folgenden finden Sie drei Möglichkeiten, wie Sie das Datenrisiko in Ihrem Unternehmen verringern können:

1

Vereinbaren Sie eine Demo mit uns, um Varonis in Aktion zu erleben. Wir passen die Session an die Datensicherheitsanforderungen Ihres Unternehmens an und beantworten alle Fragen.

2

Sehen Sie sich ein Beispiel unserer Datenrisikobewertung an und erfahren Sie, welche Risiken in Ihrer Umgebung lauern könnten. Varonis DRA ist völlig kostenlos und bietet einen klaren Weg zur automatischen Sanierung.

3

Folgen Sie uns auf LinkedIn, YouTubeund X (Twitter), um kurze Einblicke in alle Themen der Datensicherheit zu erhalten, einschließlich Data Security Posture Management (DSPM), Bedrohungserkennung, KI-Sicherheit und mehr.

Testen Sie Varonis gratis.

Detaillierte Zusammenfassung Ihrer Datensicherheitsrisiken
Umsetzbare Empfehlungen, die auf Ihre Bedürfnisse zugeschnitten sind
Ohne Bedingungen und Auflagen

Weiter lesen

Varonis bewältigt Hunderte von Anwendungsfällen und ist damit die ultimative Plattform, um Datenschutzverletzungen zu stoppen und Compliance sicherzustellen.

skripting-tutorial-in-windows-powershell-für-anfänger
Skripting-Tutorial in Windows-PowerShell für Anfänger
Neu im Thema PowerShell-Skripting? In diesen Skripting-Tutorials erfahren Sie, wie Sie grundlegende Skripte, PowerShell-Cmdlets, Aliase, Pipes und vieles mehr schreiben und ausführen.
powershell-ressourcenzentrum
PowerShell-Ressourcenzentrum
PowerShell ist ein von Microsoft entwickeltes Shell-Framework zur Skripterstellung, das ursprünglich für die Verwaltung von Windows-Systemen konzipiert wurde.
rückgängigmachen-eines-commit-in-git-(powershell-git-tutorial)
Rückgängigmachen eines Commit in Git (PowerShell-Git-Tutorial)
Dieses PowerShell-Tutorial zeigt, wie man einen Git-Commit in einem lokalen Repository rückgängig macht – Git kann lokal ohne ein Remote-Repository verwendet werden.
die-10-besten-powershell-tutorials-im-internet
Die 10 besten PowerShell tutorials im Internet
Kein Systemadministrator wird jemals sagen: „Ich hasse Automatisierung!“ PowerShell ist eine sehr leistungsfähige Skriptinglösung für die ewig überarbeiteten Systemadministratoren und sonstigen IT-Profis geworden, mit dem fast jeder Bereich im Windows-Ökosystem...