Freigeben über


2. Lexikalische Struktur

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 als Microsoft Word-Dokument aus dem Microsoft Download Center unter: https://www.microsoft.com/download/details.aspx?id=36389 verfügbar. Dieses Word-Dokument wurde hier auf Microsoft Learn zur Anzeige konvertiert. 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.

2.1 Grammatiken

Diese Spezifikation zeigt die Syntax der PowerShell-Sprache mit zwei Grammatiken. Die lexikalische Grammatik (§B.1) zeigt, wie Unicode-Zeichen kombiniert werden, um Zeilenterminatoren, Kommentare, Leerzeichen und Tokens zu bilden. Die syntaktische Grammatik (§B.2) zeigt, wie die aus der lexikalischen Grammatik resultierenden Token zu PowerShell-Skripts kombiniert werden.

Aus Gründen der Einfachheit werden Fragmente dieser Grammatiken an geeigneten Stellen in dieser Spezifikation repliziert.

Bei jeder Verwendung der Zeichen „a“ bis „z“ in den Grammatiken wird die Groß-/Kleinschreibung nicht beachtet. Dies bedeutet, dass die Groß-/Kleinschreibung in Variablen, Aliasen, Funktionsnamen, Schlüsselwörtern, Anweisungen und Operatoren ignoriert wird. Während dieser Spezifikation werden solche Namen jedoch in Kleinbuchstaben geschrieben, mit Ausnahme einiger automatischer und voreinstellungsvariabler Variablen.

2.2 Lexikalische Analyse

2.2.1 Skripts

Syntax:

Tipp

Die ~opt~ Notation in den Syntaxdefinitionen gibt an, dass die lexikalische Entität in der Syntax optional ist.

input:
    input-elements~opt~   signature-block~opt~

input-elements:
    input-element
    input-elements   input-element

input-element:
    whitespace
    comment
    token

signature-block:
    signature-begin   signature   signature-end

signature-begin:
    new-line-character   # SIG # Begin signature block   new-line-character

signature:
    base64 encoded signature blob in multiple single-line-comments

signature-end:
    new-line-character   # SIG # End signature block   new-line-character

Beschreibung:

Der bei einem PowerShell-Translator eingehende Quellstream ist die Eingabe in ein Skript, das eine Sequenz von Unicode-Zeichen enthält. Die lexikalische Verarbeitung dieses Datenstroms umfasst die Reduzierung dieser Zeichen in eine Abfolge von Token, die zur Eingabe der syntaktischen Analyse werden.

Ein Skript ist eine Gruppe von PowerShell-Befehlen, die in einer Skriptdateigespeichert sind. Das Skript selbst hat, per se, keinen Namen und erhält seinen Namen aus der Quelldatei. Das Ende dieser Datei gibt das Ende des Skripts an.

Ein Skript kann optional eine digitale Signatur enthalten. Eine Hostumgebung ist nicht erforderlich, um Text zu verarbeiten, der auf eine Signatur folgt, oder etwas, das wie eine Signatur aussieht. Die Erstellung und Verwendung digitaler Signaturen wird von dieser Spezifikation nicht abgedeckt.

2.2.2 Zeilenabschlusszeichen

Syntax:

new-line-character:
    Carriage return character (U+000D)
    Line feed character (U+000A)
    Carriage return character (U+000D) followed by line feed character (U+000A)

new-lines:
    new-line-character
    new-lines new-line-character

Beschreibung:

Wenn new-line-character-Elemente im Eingabequellstream vorkommen, teilen sie ihn in Zeilen auf, die z. B. für Fehlerberichterstattung und Erkennen des Endes eines einzeiligen Kommentars verwendet werden können.

Ein Zeilenabschlusszeichen kann als Leerraum behandelt werden (§2.2.4).

2.2.3 Kommentare

Syntax:

comment:
    single-line-comment
    requires-comment
    delimited-comment

single-line-comment:
    # input-characters~opt~

input-characters:
    input-character
    input-characters input-character

input-character:
    Any Unicode character except a new-line-character

requires-comment:
    #Requires whitespace command-arguments

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

dashdash:
    dash dash

delimited-comment:
    < # delimited-comment-text~opt~ hashes >

delimited-comment-text:
    delimited-comment-section
    delimited-comment-text delimited-comment-section

delimited-comment-section:
    >
    hashes~opt~  not-greater-than-or-hash

hashes:
    #
    hashes #

not-greater-than-or-hash:
    Any Unicode character except > or #

Beschreibung:

Quellcode kann mithilfe von Kommentaren mit Anmerkungen versehen werden.

Ein single-line-comment beginnt mit dem Zeichen # und endet mit einem new-line-character.

Ein delimited-comment beginnt mit dem Zeichenpaar <# und endet mit dem Zeichenpaar #>. Es kann als Teil einer Quellzeile, als ganze Quellzeile oder über beliebig viele Quellzeilen hinweg auftreten.

Ein Kommentar wird als Leerraum behandelt.

Für die oben genannten Elemente gilt Folgendes:

  • Kommentare werden nicht geschachtelt.
  • Die Zeichensequenzen <# und #> haben keine besondere Bedeutung in einem einzeiligen Kommentar.
  • Das Zeichen # hat keine besondere Bedeutung in einem begrenzten Kommentar.

Die lexikalische Grammatik impliziert, dass Kommentare nicht innerhalb von Token auftreten können.

(Informationen zum Erstellen von Skriptdateien, die spezielle Kommentare enthalten, die zum Generieren von Dokumentationen aus Skriptdateien verwendet werden, finden Sie unter §A.)

Ein requires-comment gibt die Kriterien an, die erfüllt sein müssen, damit das Skript ausgeführt werden kann, in dem er enthalten ist. Das Hauptkriterium ist die Version von PowerShell, die zum Ausführen des Skripts verwendet wird. Die Mindestversionsanforderung wird wie folgt angegeben:

#Requires -Version N[.n]

Dabei ist N die (erforderliche) Hauptversion und n die (optionale) Unterversion.

Ein requires-comment kann in jeder Skriptdatei, jedoch nicht innerhalb einer Funktion oder eines Cmdlets vorhanden sein. Er muss das erste Element in einer Quellzeile sein. Ein Skript kann mehrere requires-comment-Elemente enthalten.

Eine Zeichenfolge wird nur als Kommentar erkannt, wenn diese Sequenz mit # oder <#beginnt. Als Beispiel wird "hello#there" als einzelnes Token betrachtet, während "hello #there" als das Token "hello" gefolgt von einem einzeiligen Kommentar betrachtet wird. Neben dem folgenden Leerzeichen kann der Kommentarstartsequenz auch ein beliebiges Zeichen vorangestellt werden, das den Ausdruck oder eine Anweisung beendet (z. B. ), }, ], ', " oder ;).

Ein requires-comment kann nicht in einem Snap-In vorhanden sein.

Es gibt vier weitere requires-comment-Formen:

#Requires -Assembly AssemblyId
#Requires -Module ModuleName
#Requires -PSSnapin PSSnapin [ -Version *N* [.n] ]
#Requires -ShellId ShellId

2.2.4 Leerraum

Syntax:

whitespace:
    Any character with Unicode class Zs, Zl, or Zp
    Horizontal tab character (U+0009)
    Vertical tab character (U+000B)
    Form feed character (U+000C)
    ` (The backtick character U+0060) followed by new-line-character

Beschreibung:

Leerraum besteht aus einer beliebigen Sequenz eines oder mehrerer Leerzeichen.

Mit Ausnahme der Tatsache, dass Leerraum als Trennzeichen für Token fungieren kann, wird er ignoriert.

Im Gegensatz zu einigen gängigen Sprachen betrachtet PowerShell Zeilenabschlusszeichen (§2.2.2) nicht als Leerzeichen. Ein Zeilenabschlusszeichen kann jedoch als Leerraum behandelt werden, indem ihm unmittelbar ein Backtick-Zeichen ` (U+0060) vorangestellt wird. Dies ist erforderlich, wenn der Inhalt einer Zeile syntaktisch vollständig ist, aber die folgende Zeile enthält Token, die der vorherigen Zeile zugeordnet werden sollen. Beispiel:

$number = 10 # assigns 10 to $number; nothing is written to the pipeline
+ 20 # writes 20 to the pipeline
- 50 # writes -50 to the pipeline
$number # writes $number's value, 10, to the pipeline

In diesem Beispiel zeigt der Backtick an, dass die Quellzeile fortgesetzt wird. Der folgende Ausdruck entspricht $number = 10 + 20 - 50.

$number = 10 `
+ 20 `
- 50
$number # writes $number's value to the pipeline
-20

2.3 Token

Syntax:

token:
    keyword
    variable
    command
    command-parameter
    command-argument-token
    integer-literal
    real-literal
    string-literal
    type-literal
    operator-or-punctuator

Beschreibung:

Ein Token ist das kleinste lexikalische Element innerhalb der PowerShell-Sprache.

Token können durch new-lines, Kommentare, Leerraum oder eine beliebige Kombination davon getrennt werden.

2.3.1 Schlüsselwörter

Syntax:

keyword: one of
    begin          break          catch       class
    continue       data           define      do
    dynamicparam   else           elseif      end
    exit           filter         finally     for
    foreach        from           function    if
    in             inlinescript   parallel    param
    process        return         switch      throw
    trap           try            until       using
    var            while          workflow

Beschreibung:

Ein Schlüsselwort ist eine Abfolge von Zeichen, die eine besondere Bedeutung haben, wenn sie an einer kontextabhängigen Stelle verwendet wird. In den meisten Fällen ist dies das erste Token in einer Anweisung. Es gibt jedoch andere Positionen, wie durch die Grammatik angegeben. (Ein Token, das wie ein Schlüsselwort aussieht, aber nicht in einem Schlüsselwortkontext verwendet wird, ist ein Befehlsname oder ein Befehlsargument.)

Die Schlüsselwörter class, define, from, usingund var sind für die zukünftige Verwendung reserviert.

Anmerkung

Editorhinweis: Die schlüsselwörter class und using wurden in PowerShell 5.0 eingeführt. Weitere Informationen finden Sie unter about_Classes und about_Using.

2.3.2 Variablen

Syntax:

variable:
    $$
    $?
    $^
    $   variable-scope~opt~  variable-characters
    @   variable-scope~opt~  variable-characters
    braced-variable


braced-variable:
    ${   variable-scope~opt~   braced-variable-characters   }

variable-scope:
    Global:
    Local:
    Private:
    Script:
    Using:
    Workflow:
    variable-namespace

variable-namespace:
    variable-characters   :

variable-characters:
    variable-character
    variable-characters   variable-character

variable-character:
    A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nd
    _   (The underscore character U+005F)
    ?

braced-variable-characters:
    braced-variable-character
    braced-variable-characters   braced-variable-character

braced-variable-character:
    Any Unicode character except
        }   (The closing curly brace character U+007D)
        `   (The backtick character U+0060)
    escaped-character

escaped-character:
    `   (The backtick character U+0060) followed by any Unicode character

Beschreibung:

Variablen werden ausführlich in (§5) erläutert. Die Variable „$?“ wird in §2.3.2.2 erläutert. Bereiche werden in §3.5 erläutert.

Die Variablen $$ und $^ sind für die Verwendung in einer interaktiven Umgebung reserviert, die sich außerhalb des Umfangs dieser Spezifikation befindet.

Es gibt zwei Möglichkeiten, einen Variablennamen zu schreiben: Einen Variablennamen mit geschweiften Klammern, der mit $ beginnt, gefolgt von einem in geschweifte Klammern gesetzten Satz von einem oder mehreren fast beliebigen Zeichen, und ein gewöhnlicher Variablenname, der ebenfalls mit $ beginnt, gefolgt von einem Satz von einem oder mehreren Zeichen aus einem restriktiveren Satz, als ihn ein Variablenname mit geschweiften Klammern zulässt. Jeder gewöhnliche Variablenname kann mit einem entsprechenden geklammerten Variablennamen ausgedrückt werden.

$totalCost
$Maximum_Count_26

$végösszeg # Hungarian
$итог # Russian
$総計 # Japanese (Kanji)

${Maximum_Count_26}
${Name with`twhite space and `{punctuation`}}
${E:\\File.txt}

Es gibt keine Beschränkung für die Länge eines Variablennamens, alle Zeichen in einem Variablennamen sind signifikant, und die Groß-/Kleinschreibung wird nicht unterschieden.

Es gibt verschiedene Arten von Variablen: benutzerdefinierte (§2.3.2.1), automatisch (§2.3.2.2) und Präferenz (§2.3.2.3). Sie können alle in demselben Umfang koexistieren (§3.5).

Betrachten Sie die folgende Funktionsdefinition und -aufrufe:

function Get-Power ([long]$Base, [int]$Exponent) { ... }

Get-Power 5 3 # $Base is 5, $Exponent is 3
Get-Power -Exponent 3 -Base 5 # " " "

Die Argumente werden nach Position oder Name nacheinander übergeben. Ein Satz von Argumenten kann jedoch als Gruppe mit Erweiterung in einzelne Argumente übergeben werden, die von der Laufzeitumgebung verarbeitet werden. Diese automatische Argumenterweiterung wird als Splatting bezeichnet. Beispiel:

$values = 5,3 # put arguments into an array
Get-Power @values

$hash = @{ Exponent = 3; Base = 5 } # put arguments into a Hashtable
Get-Power @hash

function Get-Power2 { Get-Power @args } # arguments are in an array

Get-Power2 -Exponent 3 -Base 5 # named arguments splatted named in
@args
Get-Power2 5 3 # position arguments splatted positionally in @args

Dies wird erreicht, indem anstelle von @$ als erstes Zeichen der übergebenen Variablen verwendet wird. Diese Schreibweise kann nur in einem Argument für einen Befehl verwendet werden.

Namen werden in verschiedene Namespaces unterteilt, die jeweils auf einem virtuellen Laufwerk gespeichert sind (§3.1). Variablen werden beispielsweise auf Variable:gespeichert, Umgebungsvariablen werden auf Env:gespeichert, Funktionen werden auf Function:gespeichert, und Aliase werden auf Alias:gespeichert. Auf alle diese Namen kann mithilfe der variable-namespace-Produktion innerhalb des variable-scope als Variablen zugegriffen werden. Beispiel:

function F { "Hello from F" }
$Function:F # invokes function F

Set-Alias A F
$Alias:A # invokes function F via A

$Count = 10
$Variable:Count # accesses variable Count
$Env:PATH # accesses environment variable PATH

Jede Verwendung eines Variablennamens mit einem expliziten Variable:-Namespace entspricht der Verwendung dieses Variablennamens ohne diese Spezifikation. Beispielsweise sind $v und $Variable:v austauschbar.

Zusätzlich zur Definition in der Sprache können Variablen auch durch das Cmdlet New-Variabledefiniert werden.

2.3.2.1 Benutzerdefinierte Variablen

Jeder von der Grammatik zulässige Variablenname, der nicht von automatischen oder Einstellungsvariablen benutzt wird, ist für benutzerdefinierte Variablen verfügbar.

Benutzerdefinierte Variablen werden durch benutzerdefinierte Skripts erstellt und verwaltet.

2.3.2.2 Automatische Variablen

Automatische Variablen speichern Statusinformationen zur PowerShell-Umgebung. Ihre Werte können in einem vom Benutzer geschriebenen Skript gelesen, aber nicht geschrieben werden.

Anmerkung

Die ursprünglich in diesem Dokument gefundene Tabelle wurde entfernt, um die Duplizierung zu reduzieren. Eine vollständige Liste der automatischen Variablen finden Sie unter about_Automatic_Variables.

2.3.2.3 Präferenzvariablen

Einstellungsvariablen speichern Benutzereinstellungen für die Sitzung. Sie werden von der PowerShell-Laufzeitumgebung erstellt und initialisiert. Ihre Werte können gelesen und in einem vom Benutzer geschriebenen Skript geschrieben werden.

Anmerkung

Die ursprünglich in diesem Dokument gefundene Tabelle wurde entfernt, um die Duplizierung zu reduzieren. Eine vollständige Liste der Einstellungsvariablen finden Sie unter about_Preference_Variables.

2.3.3 Befehle

Syntax:

generic-token:
    generic-token-parts

generic-token-parts:
    generic-token-part
    generic-token-parts generic-token-part

generic-token-part:
    expandable-string-literal
    verbatim-here-string-literal
    variable
    generic-token-char

generic-token-char:
    Any Unicode character except
        {   }   (   )   ;   ,   |   &   $
        ` (The backtick character U+0060)
        double-quote-character
        single-quote-character
        whitespace
        new-line-character
        escaped-character

generic-token-with-subexpr-start:
    generic-token-parts $(

2.3.4 Parameter

Syntax:

command-parameter:
    dash first-parameter-char parameter-chars colon~opt~

first-parameter-char:
    A Unicode character of classes Lu, Ll, Lt, Lm, or Lo
    _ (The underscore character U+005F)
    ?

parameter-chars:
    parameter-char
    parameter-chars parameter-char

parameter-char:
    Any Unicode character except
        { } ( ) ; , \| & . [
        colon
        whitespace
        new-line-character

colon:
    : (The colon character U+003A)

verbatim-command-argument-chars:
    verbatim-command-argument-part
    verbatim-command-argument-chars verbatim-command-argument-part

verbatim-command-argument-part:
    verbatim-command-string
    & non-ampersand-character
    Any Unicode character except
        |
        new-line-character

non-ampersand-character:
    Any Unicode character except &

verbatim-command-string:
    double-quote-character non-double-quote-chars
    double-quote-character

non-double-quote-chars:
    non-double-quote-char
    non-double-quote-chars non-double-quote-char

non-double-quote-char:
    Any Unicode character except
        double-quote-character

Beschreibung:

Wenn ein Befehl aufgerufen wird, können ihm Informationen über ein oder mehrere Argumente übergeben werden, auf deren Werte innerhalb des Befehls über einen Satz entsprechender Parameter zugegriffen wird. Der Prozess des Zuordnens von Parametern zu Argumenten wird Parameterbindunggenannt.

Es gibt drei Arten von Argumenten:

  • Switch-Parameter (§8.10.5): Dieser hat die Form command-parameter, wobei first-parameter-char und parameter-chars zusammen den Switch-Namen bilden, der dem Namen eines Parameters (ohne dessen führenden -) im aufgerufenen Befehl entspricht. Wenn der nachstehende Doppelpunkt weggelassen wird, zeigt das Vorhandensein dieses Arguments, dass der entsprechende Parameter auf $true festgelegt werden kann. Wenn der nachstehende Doppelpunkt vorhanden ist, muss das unmittelbar darauf folgende Argument einen booleschen Wert angeben, und der entsprechende Parameter wird auf diesen Wert festgelegt. Beispielsweise sind die folgenden Aufrufe gleichwertig:

    Set-MyProcess -Strict
    Set-MyProcess -Strict: $true
    
  • Parameter mit Argument (§8.10.2): Dieser hat die Form command-parameter, wobei first-parameter-char und parameter-chars zusammen den Parameternamen bilden, der dem Namen eines Parameters (ohne dessen führenden „-“) im aufgerufenen Befehl entspricht. Es darf dort keinen nachstehenden Doppelpunkt geben. Das unmittelbar folgende Argument kennzeichnet einen zugeordneten Wert. Bei einem Befehl Get-Power, der die Parameter $Base und $Exponenthat, sind die folgenden Aufrufe äquivalent:

    Get-Power -Base 5 -Exponent 3
    Get-Power -Exponent 3 -Base 5
    
  • Positionsargument (§8.10.2) – Argumente und ihre entsprechenden Parameter in Befehlen haben Positionen, wobei die erste Position die Null ist. Das Argument in Position 0 ist an den Parameter an Position 0 gebunden; das Argument in Position 1 ist an den Parameter an Position 1 gebunden; und so weiter. Bei einem Befehl Get-Power mit den Parametern $Base und $Exponent an den Positionen 0 und 1 wird dieser Befehl beispielsweise folgendermaßen aufgerufen:

    Get-Power 5 3
    

Einzelheiten zu den speziellen Parametern und --finden Sie unter --%.

Wenn ein Befehl aufgerufen wird, kann ein Parametername abgekürzt werden. Ein beliebiger führender Teil des vollständigen Namens kann verwendet werden, vorausgesetzt, dies ist in Bezug auf die Namen der anderen Parameter, die vom selben Befehl akzeptiert werden, eindeutig.

Informationen zur Parameterbindung finden Sie unter §8.14.

2.3.5 Literale

Syntax:

literal:
    integer-literal
    real-literal
    string-literal

2.3.5.1 Numerische Literale

Es gibt zwei Arten numerischer Literale: ganze Zahl (§2.3.5.1.1) und reelle Zahl (§2.3.5.1.2). Beide können Multiplikatorsuffixe aufweisen (§2.3.5.1.3).

2.3.5.1.1 Ganzzahlenliterale

Syntax:

integer-literal:
    decimal-integer-literal
    hexadecimal-integer-literal

decimal-integer-literal:
    decimal-digits numeric-type-suffix~opt~ numeric-multiplier~opt~

decimal-digits:
    decimal-digit
    decimal-digit decimal-digits

decimal-digit: one of
    0  1  2  3  4  5  6  7  8  9

numeric-type-suffix:
    long-type-suffix
    decimal-type-suffix

hexadecimal-integer-literal:
    0x hexadecimal-digits long-type-suffix~opt~
    numeric-multiplier~opt~

hexadecimal-digits:
    hexadecimal-digit
    hexadecimal-digit decimal-digits

hexadecimal-digit: one of
    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

long-type-suffix:
    l

numeric-multiplier: one of
    kb mb gb tb pb

Beschreibung:

Der Typ eines ganzzahligen Literals wird durch seinen Wert, das Vorhandensein oder Fehlen des long-type-suffix und das Vorhandensein eines numeric-multiplier bestimmt (§2.3.5.1.3).

Für ein ganzzahliges Literal ohne long-type-suffix

  • Kann sein Wert durch Typ int (§4.2.3) dargestellt werden, ist dies der Typ;
  • Wenn der Wert andernfalls durch den Typ Long (§4.2.3) dargestellt werden kann, ist dies sein Typ.
  • Andernfalls, wenn sein Wert durch Typ Dezimal (§2.3.5.1.2) dargestellt werden kann, ist das sein Typ.
  • Andernfalls wird er durch den Typ Double (§2.3.5.1.2) dargestellt.

Für ein ganzzahliges Literal mit long-type-suffix

  • Wenn sein Wert durch Typ long (§4.2.3) dargestellt werden kann, ist dies der Typ;
  • Andernfalls ist dieses Literal nicht wohlgeformt.

In der Zweierkomplementdarstellung von ganzzahligen Werten gibt es einen negativen Wert mehr als positive Werte. Für den Int-Typ lautet dieser Zusätzliche Wert -2147483648. Für den Long-Typ ist dieser zusätzliche Wert -9223372036854775808. Obwohl das Token 2147483648 normalerweise als Literal vom Typ Long behandelt wird, werden dieser Operator und das Literal als Literal vom Typ Int mit dem kleinsten Wert behandelt, wenn ihm unmittelbar der unäre Operator „-“ vorangestellt ist. Obwohl das Token 9223372036854775808 normalerweise als Literal vom Typ Real behandelt wird, werden dieser Operator und das Literal ebenso als Literal vom Typ Long mit dem kleinsten Wert behandelt, wenn ihm unmittelbar der unäre Operator „-“ vorangestellt ist.

Einige Beispiele für ganzzahlige Literale sind 123 (int), 123L (lang) und 20000000000 (lang).

Es gibt kein ganzzahliges Literal vom Typ Byte.

2.3.5.1.2 Real-Literale

Syntax:

real-literal:
    decimal-digits . decimal-digits exponent-part~opt~ decimal-type-suffix~opt~ numeric-multiplier~opt~
    . decimal-digits exponent-part~opt~ decimal-type-suffix~opt~ numeric-multiplier~opt~
    decimal-digits exponent-part decimal-type-suffix~opt~ numeric-multiplier~opt~

exponent-part:
    e sign~opt~  decimal-digits

sign: one of
    +
    dash

decimal-type-suffix:
    d
    l

numeric-multiplier: one of
    kb mb gb tb pb

dash:
    - (U+002D)
    EnDash character (U+2013)
    EmDash character (U+2014)
    Horizontal bar character (U+2015)

Beschreibung:

Ein Real-Literal kann einen numeric-multiplier (§2.3.5.1.3) enthalten.

Es gibt zwei Arten von Real-Literalen: Double und Dezimal. Diese sind am Fehlen bzw. Vorhandensein von decimal-type-suffix zu erkennen. (Es gibt kein Gleitkomma-Real-Literal.)

Ein Double-Real-Literal hat den Typ Double (§4.2.4.1). Ein Dezimal-Real-Literal hat den Typ Dezimal (§4.2.4.2). Nachstellende Nullen im Bruchteil eines Dezimal-Real-Literals sind von Bedeutung.

Wenn der Wert der decimal-digits von exponent-part in einem Double-Real-Literal kleiner als der unterstützte Mindestwert ist, ist der Wert dieses Double-Real-Literals 0 (null). Wenn der Wert der decimal-digits von exponent-part in einem Dezimal-Real-Literal kleiner als der unterstützte Mindestwert ist, ist dieses Literal nicht wohlgeformt. Wenn der Wert der decimal-digits von exponent-part in einem Double- oder Dezimal-Real-Literal größer als der unterstützte Höchstwert ist, ist dieses Literal nicht wohlgeformt.

Einige Beispiele für doppelte reale Literale sind 1., 1.23, .45e35, 32.e+12 und 123.456E-231.

Einige Beispiele für dezimale reale Literale sind 1d (mit Skalierung 0), 1,20d (mit Skalierung 2), 1,23450e1d (d. h. 12,3450, die Skalierung 4 hat), 1,2345e3d (d. h., 1234,5, das Skalierung 1 hat, 1,2345e-1d (d. h. 0,12345, die Skalierung 5 hat), und 1,2345e-3d (d. h. 0,0012345, die Skalierung 7 hat).

Anmerkung

Da ein Double-Real-Literal keinen Bruch- oder Exponententeil haben muss, werden die Gruppierungsklammern in (123).M verwendet, um sicherzustellen, dass die Eigenschaft oder Methode M für das ganzzahlige Objekt ausgewählt wird, dessen Wert 123 ist. Ohne diese Klammern wäre das Real-Literal nicht wohlgeformt.

Anmerkung

PowerShell bietet zwar keine Literale für Unendlichkeiten und NaNs, aber Double-Real-Äquivalente können aus den statischen schreibgeschützten Eigenschaften PositiveInfinity, NegativeInfinity und NaN der Typen Gleitkomma und Double gewonnen werden (§4.2.4.1).

Die Grammatik erlaubt, dass das, was als Double-Real-Literal beginnt, ein l- oder L-Typsuffix haben kann. Ein solches Token ist tatsächlich ein ganzzahliges Literal, dessen Wert durch den Typ Long dargestellt wird.

Anmerkung

Dieses Feature wurde aus Gründen der Abwärtskompatibilität mit früheren Versionen von PowerShell beibehalten. Programmierer werden jedoch davon abgeraten, Zahlenliterale dieser Form zu verwenden, da sie den tatsächlichen Wert des Literals leicht verdecken können. Beispielsweise hat 1,2L den Wert 1, 1,2345e1L den Wert 12, und 1,2345e-5L hat den Wert 0, von denen keine sofort offensichtlich ist.

2.3.5.1.3 Multiplikatorsuffixe

Syntax:

numeric-multiplier: *one of*
    kb mb gb tb pb

Beschreibung:

Der Einfachheit halber können ganzzahlige und Real-Literale einen numeric-multiplier enthalten, der einen Satz von 10 häufig verwendeten Potenzen angibt. numeric-multiplier kann in einer beliebigen Kombination aus Groß- oder Kleinbuchstaben geschrieben werden.

Multiplikator Bedeutung Beispiel
kb Kilobyte (1024) 1 kb ≡ 1024
mb Megabyte (1024 x 1024) 1,30 MB ≡ 1363148.80
gb Gigabyte (1024 x 1024 x 1024) 0x10Gb ≡ 17179869184
tb Terabyte (1024 x 1024 x 1024 x 1024) 1.4e23tb ≡ 1.5393162788864E+35
pb petabyte (1024 x 1024 x 1024 x 1024 x 1024) 0x12Lpb-≡ 20266198323167232

2.3.5.2 Zeichenfolgenliterale

Syntax:

string-literal:
    expandable-string-literal
    expandable-here-string-literal
    verbatim-string-literal
    verbatim-here-string-literal

expandable-string-literal:
    double-quote-character expandable-string-characters~opt~  dollars~opt~ double-quote-character

double-quote-character:
    " (U+0022)
    Left double quotation mark (U+201C)
    Right double quotation mark (U+201D)
    Double low-9 quotation mark (U+201E)

expandable-string-characters:
      expandable-string-part
      expandable-string-characters
      expandable-string-part

expandable-string-part:
    Any Unicode character except
        $
        double-quote-character
        ` (The backtick character U+0060)
    braced-variable
    $ Any Unicode character except
        (
        {
        double-quote-character
        ` (The backtick character U+0060)*
    $ escaped-character
    escaped-character
    double-quote-character double-quote-character

dollars:
    $
    dollars $

expandable-here-string-literal:
    @  double-quote-character  whitespace~opt~  new-line-character
        expandable-here-string-characters~opt~  new-line-character  double-quote-character  @

expandable-here-string-characters:
    expandable-here-string-part
    expandable-here-string-characters  expandable-here-string-part

expandable-here-string-part:
    Any Unicode character except
        $
        new-line-character
    braced-variable
    $ Any Unicode character except
        (
        new-line-character
    $ new-line-character  Any Unicode character except double-quote-char
    $ new-line-character double-quote-char  Any Unicode character except @
    new-line-character  Any Unicode character except double-quote-char
    new-line-character double-quote-char  Any Unicode character except @

expandable-string-with-subexpr-start:
    double-quote-character  expandable-string-chars~opt~  $(

expandable-string-with-subexpr-end:
    double-quote-char

expandable-here-string-with-subexpr-start:
    @  double-quote-character  whitespace~opt~  new-line-character  expandable-here-string-chars~opt~  $(

expandable-here-string-with-subexpr-end:
    new-line-character  double-quote-character  @

verbatim-string-literal:
    single-quote-character verbatim-string-characters~opt~ single-quote-char

single-quote-character:
    ' (U+0027)
    Left single quotation mark (U+2018)
    Right single quotation mark (U+2019)
    Single low-9 quotation mark (U+201A)
    Single high-reversed-9 quotation mark (U+201B)

verbatim-string-characters:
    verbatim-string-part
    verbatim-string-characters verbatim-string-part

verbatim-string-part:
    *Any Unicode character except* single-quote-character
    single-quote-character  single-quote-character

verbatim-here-string-literal:
    @ single-quote-character whitespace~opt~  new-line-character
        verbatim-here-string-characters~opt~  new-line-character
            single-quote-character *@*

verbatim-*here-string-characters:
    verbatim-here-string-part
    verbatim-here-string-characters  verbatim-here-string-part

verbatim-here-string-part:
    Any Unicode character except* new-line-character
    new-line-character  Any Unicode character except single-quote-character
    new-line-character  single-quote-character  Any Unicode character except @

Beschreibung:

Es gibt vier Arten von Zeichenfolgenliteralen:

  • verbatim-string-literal (einzeilig, einfache Anführungszeichen), eine Sequenz von 0 (null) oder mehr Zeichen, die durch ein single-quote-character-Paar getrennt sind. Beispiele sind „''“ und „'red'“.

  • expandable-string-literal (einzeilig, doppelte Anführungszeichen), eine Sequenz von 0 (null) oder mehr Zeichen, die durch ein double-quote-character-Paar getrennt sind. Beispiele sind „""“ und „"red"“.

  • verbatim-here-string-literal (einzeilig, einfache Anführungszeichen), eine Sequenz von null oder mehr Zeichen, getrennt durch die Zeichenpaare @single-quote-character bzw. single-quote-character@, alle in zwei oder mehr Quellzeilen enthalten. Beispiele:

    @'
    '@
    
    @'
    line 1
    '@
    
    @'
    line 1
    line 2
    '@
    
  • expandable-here-string-literal (mehrzeilig, doppelte Anführungszeichen), eine Sequenz von null oder mehr Zeichen, getrennt durch die Zeichenpaare @double-quote-character bzw. double-quote-character@, alle in zwei oder mehr Quellzeilen enthalten. Beispiele:

    @"
    "@
    
    @"
    line 1
    "@
    
    @"
    line 1
    line 2
    "@
    

Bei verbatim-here-string-literal- und expandable-here-string-literal-Elementen dürfen außer Leerraum (der ignoriert wird) keine Zeichen in derselben Quellzeile auf das öffnende Trennzeichenpaar folgen, und keine Zeichen dürfen in derselben Quellzeile wie dem schließenden Trennzeichenpaar voranstehen.

Der Textkörper eines verbatim-here-string-literal oder expandable-here-string-literal beginnt am Anfang der ersten Quellzeile nach dem öffnenden Trennzeichen und endet am Ende der letzten Quellzeile vor dem schließenden Trennzeichen. Der Körper kann leer sein. Das Zeilenabschlusszeichen in der letzten Quellzeile vor dem schließenden Trennzeichen ist nicht Teil des Textkörpers dieses Literals.

Ein Literal eines dieser Arten ist vom Typ Zeichenfolge (§4.3.1).

Das zum Begrenzen von verbatim-string-literal oder expandable-string-literal verwendete Zeichen kann in ein solches Zeichenfolgenliteral aufgenommen werden, indem dieses Zeichen zweimal hintereinander geschrieben wird. Beispiel: 'What''s the time?' und "I said, ""Hello"".". Ein single-quote-character hat jedoch keine besondere Bedeutung innerhalb eines expandable-string-literal, und ein double-quote-character hat keine besondere Bedeutung in einem verbatim-string-literal.

Ein expandable-string-literal und ein expandable-here-string-literal können escaped-character-Elemente (§2.3.7) enthalten. Wenn beispielsweise das folgende Zeichenfolgenliteral in die Pipeline geschrieben wird, sieht das Ergebnis wie folgt aus:

"column1`tcolumn2`nsecond line, `"Hello`", ```Q`5`!"
column1<horizontal-tab>column2<new-line>
second line, "Hello", `Q5!

Wenn ein expandable-string-literal oder expandable-here-string-literal den Namen einer Variablen enthält, wird er durch die Zeichenfolgendarstellung des Werts dieser Variablen ersetzt (§6.7), solange diesem Namen nicht unmittelbar ein Escapezeichen vorangestellt ist. Dies wird als Variablenersetzung bezeichnet.

Anmerkung

Wenn der Variablenname Teil eines größeren Ausdrucks ist, wird nur der Variablenname ersetzt. Wenn $a beispielsweise ein Array ist, das die Elemente 100 und 200 enthält, führt ">$a.Length<" zu >100 200.Length<, während ">$($a.Length)<" zu >2<führt. Siehe Informationen zur Unterausdruckserweiterung weiter unten.

Beispiel: Der Quellcode

$count = 10
"The value of `$count is $count"

z. B. im expandable-string-literal.

The value of $count is 10.

Beachten Sie Folgendes:

$a = "red","blue"
"`$a[0] is $a[0], `$a[0] is $($a[0])" # second [0] is taken literally

Das Ergebnis ist

$a[0] is red blue[0], $a[0] is red

expandable-string-literal- und expandable-here-string-literal-Elemente unterstützen auch eine Art von Ersetzung, die als Unterausdruckserweiterung bezeichnet wird, indem Text der Form $( ... ) als Unterausdruck (§7.1.6) behandelt wird. Dieser Text wird durch die Zeichenfolgendarstellung des Werts dieses Ausdrucks ersetzt (§6.8). Leerraum, der zum Trennen von Token innerhalb der statement-list von sub-expression verwendet wird, wird im Rahmen der Konstruktion der Ergebniszeichenfolge ignoriert.

Die Beispiele

$count = 10
"$count + 5 is $($count + 5)"
"$count + 5 is `$($count + 5)"
"$count + 5 is `$(`$count + 5)"

resultieren in den folgenden expandable-string-literal-Elementen:

10 + 5 is 15
10 + 5 is $(10 + 5)
10 + 5 is $($count + 5)

Die folgende Quelle

$i = 5; $j = 10; $k = 15
"`$i, `$j, and `$k have the values $( $i; $j; $k )"

resultiert im folgenden expandable-string-literal:

$i, $j, and $k have the values 5 10 15

Diese vier Zeilen könnten prägnant wie folgt geschrieben worden sein:

"`$i, `$j, and `$k have the values $(($i = 5); ($j = 10); ($k = 15))"

Im folgenden Beispiel

"First 10 squares: $(for ($i = 1; $i -le 10; ++$i) { "$i $($i*$i) " })"

lautet das resultierende expandable-string-literal wie folgt:

First 10 squares: 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81 10 100

Wie gezeigt, kann ein Unterausdruck Zeichenfolgenliterale enthalten, die sowohl eine Variablenersetzung als auch eine Unterausdruckserweiterung aufweisen. Beachten Sie auch, dass die Trennzeichen des inneren expandable-string-literal nicht mit Escapezeichen versehen werden müssen. Die Tatsache, dass sie sich innerhalb eines Unterausdrucks befinden, bedeutet, dass sie keine Abschlusszeichen für das äußere expandable-string-literal sein können.

Ein expandable-string-literal oder expandable-here-string-literal, das eine Variablenersetzung oder Unterausdruckserweiterung enthält, wird bei jeder Verwendung dieses Literals ausgewertet, z. B.

$a = 10
$s1 = "`$a = $($a; ++$a)"
"`$s1 = >$s1<"
$s2 = "`$a = $($a; ++$a)"
"`$s2 = >$s2<"
$s2 = $s1
"`$s2 = >$s2<"

was in folgenden expandable-string-literal-Elementen resultiert:

$s1 = >$a = 10<
$s2 = >$a = 11<
$s2 = >$a = 10<

Der Inhalt eines verbatim-here-string-literal wird ohne Abstriche übernommen, einschließlich aller führenden oder nachstehenden Leerzeichen im Text. Daher müssen eingebettete single-quote-character-Elemente nicht verdoppelt werden, und es gibt keine Ersetzung oder Erweiterung. Beispiel:

$lit = @'
That's it!
2 * 3 = $(2*3)
'@

was im Literal resultiert.

That's it!
2 * 3 = $(2*3)

Der Inhalt eines expandable-here-string-literal unterliegt einer Ersetzung und Erweiterung, aber alle führenden oder nachstehenden Leerzeichen innerhalb des Textkörpers, aber außerhalb von Unterausdrücken werden ohne Abstriche verwendet, und eingebettete double-quote-character-Elemente müssen nicht verdoppelt werden. Beispiel:

$lit = @"
That's it!
2 * 3 = $(2*3)
"@

was in folgendem Literal resultiert, wenn es erweitert wird:

That's it!
2 * 3 = 6

Sowohl für verbatim-here-string-literal- als auch expandable-here-string-literal-Elemente wird jedes Zeilenabschlusszeichen innerhalb des Textkörpers im resultierenden Literal auf implementierungsdefinierte Weise dargestellt. Beispiel:

$lit = @"
abc
xyz
"@

verfügt die zweite Zeile des Textkörpers über zwei führende Leerzeichen, und die erste und zweite Zeile des Textkörpers verfügen über Zeilenabschlusszeichen. Das Abschlusszeichen für die zweite Zeile des Textkörpers ist jedoch nicht Teil dieses Textkörpers. Das resultierende Literal entspricht: "abc<implementation-defined character sequence>xyz".

Anmerkung

Um die Lesbarkeit der Quelle zu verbessern, können lange Zeichenfolgenliterale über mehrere Quellzeilen verteilt werden, ohne dass Zeilenabschlusszeichen eingefügt werden. Dazu wird jeder Teil als separates Literal geschrieben, und die Teile werden mit dem „+“-Operator verkettet (§7.7.2). Dieser Operator ermöglicht seinen Operanden, eine der vier Arten von Zeichenfolgenliteralen zu bestimmen.

Anmerkung

Obwohl es kein Zeichenliteral an sich gibt, kann der gleiche Effekt erzielt werden, indem auf das erste Zeichen in einer Zeichenfolge mit 1 Zeichen wie folgt zugegriffen wird: [char]"A" oder "A"[0].

Sowohl für verbatim-here-string-literal- als auch expandable-here-string-literal-Elemente wird jedes Zeilenabschlusszeichen im Text genau so dargestellt, wie es bereitgestellt wurde.

2.3.5.3 NULL-Literal

Siehe die automatische Variable $null (§2.3.2.2).

2.3.5.4 Boolesche Literale

Siehe die automatischen Variablen $false und $true (§2.3.2.2).

2.3.5.5 Arrayliterale

PowerShell ermöglicht das Schreiben von Ausdrücken des Arraytyps (§9) mithilfe von unärem Kommaoperator (§7.2.1), array-expression (§7.1.7), binärem Kommaoperator (§7.3) und Bereichsoperator (§7.4).

2.3.5.6 Hashliterale

PowerShell ermöglicht das Schreiben von Ausdrücken des Typs Hashtable (§10) mithilfe eines hash-literal-expression (§7.1.9).

2.3.5.7 Typnamen

Syntax:

type-name:
    type-identifier
    type-name . type-identifier

type-identifier:
    type-characters

type-characters:
    type-character
    type-characters type-character

type-character:
    A Unicode character of classes Lu, Ll, Lt, Lm, Lo, or Nd
    _ (The underscore character U+005F)

array-type-name:
    type-name [

generic-type-name:
    type-name [

2.3.6 Operatoren und Interpunktionszeichen

Syntax:

operator-or-punctuator: one of
    {   }   [   ]   (   )   @(   @{   $(   ;
    &&  ||  &   |   ,   ++  ..   ::   .
    !   *   /   %   +   -   --
    -and   -band   -bnot   -bor
    -bxor   -not   -or     -xor
    assignment-operator
    merging-redirection-operator
    file-redirection-operator
    comparison-operator
    format-operator

assignment-operator: one of
    =  -=  +=  *=  /=  %=

file-redirection-operator: one of
    >  >>  2>  2>>  3>  3>>  4>  4>>
    5>  5>>  6>  6>>  *>  *>>  <

merging-redirection-operator: one of
    *>&1  2>&1  3>&1  4>&1  5>&1  6>&1
    *>&2  1>&2  3>&2  4>&2  5>&2  6>&2

comparison-operator: *one of
    -as           -ccontains      -ceq
    -cge          -cgt            -cle
    -clike        -clt            -cmatch
    -cne          -cnotcontains   -cnotlike
    -cnotmatch    -contains       -creplace
    -csplit       -eq             -ge
    -gt           -icontains      -ieq
    -ige          -igt            -ile
    -ilike        -ilt            -imatch
    -in           -ine            -inotcontains
    -inotlike     -inotmatch      -ireplace
    -is           -isnot          -isplit
    -join         -le             -like
    -lt           -match          -ne
    -notcontains  -notin         -notlike
    -notmatch     -replace       -shl*
    -shr          -split

format-operator:
    -f

Beschreibung:

&& und || sind für die zukünftige Nutzung reserviert.

Anmerkung

Editor-Hinweis: Die Pipelinekettenoperatoren && und || wurden in PowerShell 7 eingeführt. Siehe about_Pipeline_Chain_Operators.

Der Name nach dash in einem Operator ist nur in einem Operatorkontext für diesen Zweck reserviert.

Ein Operator, der mit dash beginnt, darf keinen Leerraum zwischen diesem dash und dem darauf folgenden Token aufweisen.

2.3.7 Escapezeichen

Syntax:

escaped-character:
    ` (The backtick character U+0060) followed by any Unicode character

Beschreibung:

Als Escapezeichen wird einem Zeichen eine besondere Interpretation zugeordnet, indem ihm ein Backtick-Präfixzeichen (U+0060) zugewiesen wird. Die folgende Tabelle zeigt die Bedeutung der einzelnen Escapezeichen:

Escapezeichen Bedeutung
`a Warnung (U+0007)
`b Rücktaste (U+0008)
`f Seitenvorschub (U+000C)
`n Zeilenvorschub (U+000A)
`r Wagenrücklauf (U+000D)
`t Horizontaler Tabstopp (U+0009)
`v Vertikaler Tabstopp (U+0009)
`' Einfaches Anführungszeichen (U+0027)
`" Doppeltes Anführungszeichen (U+0022)
`` Backtick (U+0060)
`0 NULL (U+0000)
`x Wenn x keines der oben gezeigten Zeichen ist, wird das Backtick-Zeichen ignoriert und x wörtlich genommen.

Die Auswirkung des endgültigen Eintrags in der obigen Tabelle ist, dass Leerzeichen, die andernfalls Token trennen würden, stattdessen zu einem Teils eines Tokens gemacht werden können. Beispielsweise kann ein Dateiname, der ein Leerzeichen enthält, als Test` Data.txt (sowie 'Test Data.txt' oder "Test Data.txt") geschrieben werden.