Freigeben über


5. Variablen

Redaktionelle Notiz

Wichtig

Die Windows PowerShell Language Specification 3.0 wurde im Dezember 2012 veröffentlicht und basiert auf Windows PowerShell 3.0. Diese Spezifikation spiegelt nicht den aktuellen Status von PowerShell wider. Es ist nicht geplant, diese Dokumentation zu aktualisieren, um den aktuellen Zustand widerzuspiegeln. Diese Dokumentation wird hier zur historischen Referenz vorgestellt.

Das Spezifikationsdokument ist im Microsoft Download Center als Microsoft Word-Dokument verfügbar unter: https://www.microsoft.com/download/details.aspx?id=36389. Dieses Word-Dokument wurde für die Präsentation hier auf Microsoft Learn angepasst. Während der Konvertierung wurden einige redaktionelle Änderungen vorgenommen, um die Formatierung für die Docs-Plattform zu berücksichtigen. Einige Tippfehler und kleinere Fehler wurden korrigiert.

Eine Variable stellt einen Speicherort für einen Wert dar, und dieser Wert weist einen Typ auf. Traditionelle prozedurale Programmiersprachen sind statisch typisiert; das heißt, der Laufzeittyp einer Variablen ist der, mit dem sie zur Kompilierungszeit deklariert wurde. Objektorientierte Sprachen fügen die Idee der Vererbung hinzu, wodurch der Laufzeittyp einer Variablen das sein kann, mit dem sie zur Kompilierungszeit deklariert wurde, oder einen Typ, der von diesem Typ abgeleitet wurde. Da es sich um eine dynamisch typisierte Sprache handelt, weisen PowerShell-Variablen an sich keine Typen auf. Tatsächlich werden Variablen nicht definiert; sie werden einfach erstellt, wenn ihnen erstmals ein Wert zugewiesen wird. Eine Variable kann zwar auf einen Wert eines bestimmten Typs eingeschränkt werden (§ 5.3), die Typinformationen in einer Zuweisung können jedoch nicht immer statisch überprüft werden.

Zu unterschiedlichen Zeiten kann eine Variable werten unterschiedlicher Typen zugeordnet werden, entweder durch Zuordnung (§7.11) oder die Verwendung der ++ und ‑‑ Operatoren (§7.1.5, §7.2.6). Wenn der einer Variablen zugeordnete Wert geändert wird, kann sich der Typ dieses Werts ändern. Beispiel:

$i = "abc"        # $i holds a value of type string
$i = 2147483647   # $i holds a value of type int
++$i              # $i now holds a value of type double because
                  # 2147483648 is too big to fit in type int

Jede Verwendung einer Variablen, die nicht erstellt wurde, führt zum Wert $null. Um festzustellen, ob eine Variable definiert wurde, verwenden Sie das Cmdlet Test-Path.

5.1 Beschreibbarer Speicherort

Ein beschreibbarer Speicherort ist ein Ausdruck zur Angabe einer Ressource, auf die ein Befehl sowohl Lese- als auch Schreibzugriff hat. Dabei kann es sich um eine Variable (§ 5), ein Arrayelement (§ 9), einen zugeordneten Wert in einer Hashtabelle, auf den über einen Index (§ 10) zugegriffen werden kann, eine Eigenschaft (§ 7.1.2) oder einen durch einen Anbieter verwalteten Speicher (§ 3.1) handeln.

5.2 Variablenkategorien

PowerShell definiert die folgenden Variablenkategorien: statische Variablen, Instanzvariablen, Arrayelemente, Hashtable-Schlüssel-Wert-Paare, Parameter, normale Variablen und Variablen auf Anbieterlaufwerken. Die folgenden Unterabschnitte beschreiben jede dieser Kategorien.

Im folgenden Beispiel

function F ($p1, $p2) {
    $radius = 2.45
    $circumference = 2 * ([Math]::PI) * $radius

    $date = Get-Date -Date "2010-2-1 10:12:14 pm"
    $month = $date.Month

    $values = 10, 55, 93, 102
    $value = $values[2]

    $h1 = @{ FirstName = "James"; LastName = "Anderson" }
    $h1.FirstName = "Smith"

    $Alias:A = "Help"
    $Env:MyPath = "E:\Temp"
    ${E:output.txt} = 123
    $Function:F = { "Hello there" }
    $Variable:v = 10
}
  • [Math::PI] ist eine statische Variable
  • $date.Month ist eine Instanzvariable
  • $values[2] ist ein Arrayelement
  • $h1.FirstName ist ein Hashtable Schlüssel, dessen entsprechender Wert $h1['FirstName'] ist.
  • $p1 und $p2 sind Parameter
  • $radius, $circumference, $date, $month, $values, $valueund $h1 sind gewöhnliche Variablen
  • $Alias:A, $Env:MyPath, ${E:output.txt} und $Function:F stellen Variablen auf den entsprechenden Anbieterlaufwerken dar.
  • $Variable:v stellt eine gewöhnliche Variable dar, die mit dem vollqualifizierten Anbieterlaufwerk angegeben wird.

5.2.1 Statische Variablen

Ein Datenelement eines Objekts, das zum Typ des Objekts gehört, und nicht zu dieser bestimmten Instanz des Typs, wird als statische Variablebezeichnet. Einige Beispiele finden Sie unter §4.2.3, §4.2.4.1und §4.3.8.

PowerShell bietet keine Möglichkeit, neue Typen zu erstellen, die statische Variablen enthalten; Objekte solcher Typen können jedoch von der Hostumgebung bereitgestellt werden.

Speicher zum Erstellen und Löschen von Objekten, die statische Variablen enthalten, wird von der Hostumgebung und dem Garbage Collection-System verwaltet.

Informationen zum Zugriff auf eine statische Variable finden Sie unter §7.1.2.

Ein statisches Datenelement kann ein Feld oder eine Eigenschaft sein.

5.2.2 Instanzvariablen

Eine Instanzvariable ist der Datenmember eines Objekts, der zu der spezifischen Instanz des Objekttyps und nicht zum Typ selbst gehört. Einige Beispiele finden Sie unter §4.3.1, §4.3.2und §4.3.3.

Eine PowerShell-Hostumgebung bietet möglicherweise eine Möglichkeit, neue Typen zu erstellen, die Instanzvariablen enthalten, oder neue Instanzvariablen zu vorhandenen Typen hinzufügen.

Speicher zum Erstellen und Löschen von Objekten, die statische Variablen enthalten, wird von der Hostumgebung und dem Garbage Collection-System verwaltet.

Informationen zum Zugriff auf eine Instanzvariable finden Sie unter §7.1.2.

Ein Instanzdatenmember kann ein Feld oder eine Eigenschaft sein.

5.2.3 Arrayelemente

Ein Array kann über einen unären Kommaoperator (§ 7.2.1), einen sub-Ausdruck (§ 7.1.6), einen array-Ausdruck (§ 7.1.7), einen binären Kommaoperator (§ 7.3), einen Bereichsoperator (§ 7.4) oder das Cmdlet New-Object erstellt werden.

Der Arbeitsspeicher zum Erstellen und Löschen von Arrays wird von der Hostumgebung und der automatischen Speicherbereinigung verwaltet.

Ausführliche Informationen zu Arrays und Arrayelementen finden Sie unter § 9.

5.2.4 Schlüssel-Wert-Paare in Hashtabellen

Eine Hashtabelle wird über ein Hashliteral (§ 2.3.5.6) oder das Cmdlet New-Object erstellt. Ein neues Schlüssel-Wert-Paar kann über den [] Operator (§7.1.4.3) hinzugefügt werden.

Der Arbeitsspeicher zum Erstellen und Löschen von Hashtabellen wird von der Hostumgebung und der automatischen Speicherbereinigung verwaltet.

Ausführliche Informationen zu Hashtabellen finden Sie unter § 10.

5.2.5 Parameter

Ein Parameter wird erstellt, wenn sein übergeordneter Befehl aufgerufen wird, und er wird mit dem Wert des Arguments initialisiert, das im Aufruf oder in der Hostumgebung bereitgestellt wird. Ein Parameter ist nicht mehr vorhanden, wenn sein übergeordneter Befehl beendet wird.

Parameter werden in §8.10erläutert.

5.2.6 Gewöhnliche Variablen

Eine gewöhnliche Variable wird durch einen assignment-Ausdruck (§ 7.11) oder eine foreach-Anweisung (§ 8.4.4) definiert. Einige gewöhnliche Variablen werden von der Hostumgebung vordefiniert, während andere vorübergehend sind und zur Laufzeit nach Bedarf kommen und gehen.

Die Lebensdauer einer gewöhnlichen Variablen ist der Zeitraum der Programmausführung, in dem der Speicher dafür garantiert reserviert ist. Diese Lebensdauer beginnt mit dem Einstieg in den Bereich, dem sie zugeordnet ist, und endet nicht früher als das Ende der Ausführung dieses Bereichs. Wenn der übergeordnete Bereich rekursiv oder iterativ eingegeben wird, wird jedes Mal eine neue Instanz der lokalen Variablen erstellt.

Der durch eine gewöhnliche Variable bezeichnete Speicher wird unabhängig von der Lebensdauer dieser Variablen zurückgefordert.

Eine gewöhnliche Variable kann explizit mit dem Namespacepräfix Variable: (§ 5.2.7) benannt werden.

5.2.7 Variablen auf Anbieterlaufwerken

Eine Einführung in Anbieter und Laufwerke finden Sie unter § 3.1. Dort haben Sie auch erfahren, dass jeder Anbieter eigene Namespacelaufwerke bereitstellen kann. Der Zugriff auf Ressourcen in diesen Laufwerken erfolgt, als ob sie gewöhnliche Variablen wären (§5.2.6). Eine gewöhnliche Variable wird auf dem Anbieterlaufwerk des Dateisystems „Variable:“ (§ 3.1.5) gespeichert und kann über ihren normalen Namen oder den vollqualifizierten Namespacenamen aufgerufen werden.

Einige Namespacevariablentypen sind implizit eingeschränkt (§5.3).

5.3 Eingeschränkte Variablen

Standardmäßig kann eine Variable einen Wert eines beliebigen Typs festlegen. Eine Variable kann jedoch so eingeschränkt werden, dass sie nur Werte eines bestimmten Typs angibt. Hierfür muss dieser Typ als Typliteral vor dessen Namen in einer Zuweisung oder einem Parameter angegeben werden. Beispiel:

[int]$i = 10   # constrains $i to designating ints only
$i = "Hello"   # error, no conversion to int
$i = "0x10"    # ok, conversion to int
$i = $true     # ok, conversion to int

function F ([int]$p1, [switch]$p2, [regex]$p3) { ... }

Jede Variable, die dem Namespace Env:, Alias:oder dem Dateisystemnamespace gehört (§2.3.2, §3.1) wird implizit auf den Typ stringbeschränkt. Jede Variable, die dem Namespace Function gehört: (§2.3.2, §3.1) wird implizit auf den Typ scriptblockbeschränkt.