Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Redaktionelle Notiz
Von Bedeutung
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 steht als Microsoft Word-Dokument im Microsoft Download Center unter: https://www.microsoft.com/download/details.aspx?id=36389 zur Verfügung. Dieses Word-Dokument wurde für die Darstellung hier auf Microsoft Learn umgewandelt. 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.
Syntax:
expression:
primary-expression
bitwise-expression
logical-expression
comparison-expression
additive-expression
multiplicative-expression
dash: one of
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
dashdash:
dash dash
Beschreibung:
Ein Ausdruck ist eine Abfolge von Operatoren und Operanden, die eine Methode, eine Funktion, eine schreibbare Position oder einen Wert festlegen; gibt die Berechnung eines Werts an; erzeugt einen oder mehrere Nebenwirkungen; oder führt eine Kombination davon aus. Beispiel:
- Das Literal 123 ist ein Ausdruck, der den Int-Wert 123 angibt.
- Der Ausdruck
1,2,3,4bestimmt das 4-Element-Arrayobjekt mit den angezeigten Werten. - Der Ausdruck
10.4 * $agibt eine Berechnung an. - Der Ausdruck
$a++erzeugt einen Nebeneffekt. - Der Ausdruck
$a[$i--] = $b[++$j]führt eine Kombination dieser Dinge aus.
Mit Ausnahme einiger Operatoren sind die Reihenfolge der Auswertung von Begriffen in einem Ausdruck und die Reihenfolge, in der Nebenwirkungen stattfinden, nicht angegeben. Beispiele für nicht angegebenes Verhalten sind: $i++ + $i, , $i + --$iund $w[$j++] = $v[$j].
Eine Implementierung von PowerShell bietet möglicherweise Unterstützung für benutzerdefinierte Typen, und diese Typen haben möglicherweise Vorgänge, die für sie definiert sind. Alle Details zu solchen Typen und Vorgängen sind implementierungsdefiniert.
Ein Ausdruck auf oberster Ebene ist ein Ausdruck, der nicht Teil eines größeren Ausdrucks ist. Wenn ein Ausdruck auf oberster Ebene einen Nebeneffektoperator enthält, wird der Wert dieses Ausdrucks nicht in die Pipeline geschrieben; andernfalls ist es. Eine ausführliche Erläuterung hierzu finden Sie unter §7.1.1 .
Ordinarily, an expression that designates a collection ([§4§4]) is enumerated into its constituent elements when the value of that expression is used. Dies ist jedoch nicht der Fall, wenn der Ausdruck ein Cmdlet-Aufruf ist. Beispiel:
$x = 10,20,30
$a = $($x; 99) # $a.Length is 4
$x = New-Object 'int[]' 3
$a = $($x; 99) # equivalent, $a.Length is 4
$a = $(New-Object 'int[]' 3; 99) # $a.Length is 2
In den ersten beiden Verwendungen des $(...) Operators ist der Ausdruck, der die Auflistung bestimmt, die Variable $x, die aufgezählt wird, was zu drei int Werten plus int 99 führt. Im dritten Fall ist der Ausdruck jedoch ein direkter Aufruf eines Cmdlets, sodass das Ergebnis nicht aufgezählt wird und $a ein Array von zwei Elementen int[3] und intein Array ist.
Wenn ein Vorgang nicht von PowerShell definiert ist, wird der Vom linken Operanden festgelegte Werttyp überprüft, um festzustellen, ob er über eine entsprechende op_<operation> Methode verfügt.
7.1 Primäre Ausdrücke
Syntax:
primary-expression:
value
member-access
element-access
invocation-expression
post-increment-expression
post-decrement-expression
value:
parenthesized-expression
sub-expression
array-expression
script-block-expression
hash-literal-expression
literal
type-literal
variable
7.1.1 Gruppierungsklammern
Syntax:
Tipp
Die ~opt~ Notation in den Syntaxdefinitionen gibt an, dass die lexikalische Entität in der Syntax optional ist.
parenthesized-expression:
( new-lines~opt~ pipeline new-lines~opt~ )
Beschreibung:
Ein Klammerausdruck ist ein primärer Ausdruck , dessen Typ und Wert mit denen des Ausdrucks ohne die Klammern identisch sind. Wenn der Ausdruck eine Variable angibt, bestimmt der Klammerausdruck dieselbe Variable. Zum Beispiel sind $x.m und ($x).m gleichwertig.
Gruppierungsklammern können in einem Ausdruck verwendet werden, um die Standardrangfolge und Zuordnung innerhalb dieses Ausdrucks zu dokumentieren. Sie können auch verwendet werden, um diese Standardrangfolge und Zuordnung außer Kraft zu setzen. Beispiel:
4 + 6 * 2 # 16
4 + (6 * 2) # 16 document default precedence
(4 + 6) * 2 # 20 override default precedence
Ordinarily, gruppieren Klammern auf der obersten Ebene sind redundant. Das ist jedoch nicht immer der Fall. Betrachten Sie das folgenden Beispiel:
2,4,6 # Length 3; values 2,4,6
(2,4),6 # Length 2; values [Object[]],int
Im zweiten Fall ändern die Klammern die Semantik, was zu einem Array führt, dessen zwei Elemente ein Array von 2 Ints und der Skalar int 6 sind.
Hier ist eine weitere Ausnahme:
23.5/2.4 # pipeline gets 9.79166666666667
$a = 1234 * 3.5 # value not written to pipeline
$a # pipeline gets 4319
In den ersten und dritten Fällen wird der Wert des Ergebnisses in die Pipeline geschrieben. Obwohl der Ausdruck im zweiten Fall ausgewertet wird, wird das Ergebnis aufgrund des Vorhandenseins des Seiteneffektoperators = auf oberster Ebene nicht in die Pipeline geschrieben. (Das Entfernen des $a = Teils ermöglicht das Schreiben des Werts, da * es sich nicht um einen Nebeneffektoperator handelt.)
Um zu verhindern, dass ein Wert eines Ausdrucks, der keine Nebenwirkungen der obersten Ebene enthält, in die Pipeline geschrieben wird, verwerfen Sie ihn explizit wie folgt:
# None of these value are written to pipeline
[void](23.5/2.4)
[void]$a
$null = $a
$a > $null
Wenn Sie in die Pipeline schreiben möchten, geben Sie diesen Ausdruck wie folgt in Klammern ein, um den Wert eines ausdrucks mit Nebeneffekten der obersten Ebene in die Pipeline zu schreiben:
($a = 1234 * 3.5) # pipeline gets 4319
Daher sind die Gruppierungsklammern in diesem Fall nicht redundant.
Im folgenden Beispiel wird eine variable Ersetzung (§2.3.5.2) in einem Zeichenfolgenliteral durchgeführt:
">$($a = -23)<" # value not written to pipeline, get ><
">$(($a = -23))<" # pipeline gets >-23<
Im ersten Fall stellen die Klammern die Trennzeichen eines Unterausdrucksdar, die keine Klammern gruppieren, und da der Ausdruck auf oberster Ebene einen Nebeneffektoperator enthält, wird der Wert des Ausdrucks nicht in die Pipeline geschrieben. Natürlich sind die Zeichen und < Zeichen > noch geschrieben.) Wenn gruppierende Klammern hinzugefügt werden (wie im zweiten Fall gezeigt), ist das Schreiben aktiviert.
Die folgenden Beispiele enthalten jeweils Seiteneffektoperatoren auf oberster Ebene:
$a = $b = 0 # value not written to pipeline
$a = ($b = 0) # value not written to pipeline
($a = ($b = 0)) # pipeline gets 0
++$a # value not written to pipeline
(++$b) # pipeline gets 1
$a-- # value not written to pipeline
($b--) # pipeline gets 1
Die Verwendung von Gruppierungsklammern um einen Ausdruck, der keine Nebeneffekte der obersten Ebene enthält, macht diese Klammern redundant. Beispiel:
$a # pipeline gets 0
($a) # no side effect, so () redundant
Betrachten Sie das folgende Beispiel mit zwei Nebenwirkungen, von denen keiner auf der obersten Ebene liegt:
12.6 + ($a = 10 - ++$b) # pipeline gets 21.6.
Das Ergebnis wird in die Pipeline geschrieben, da der Ausdruck auf oberster Ebene keine Nebenwirkungen hat.
7.1.2 Mitgliedszugriff
Syntax:
member-access:
primary-expression . new-line~opt~ member-name
primary-expression :: new-line~opt~ member-name
Beachten Sie, dass nach dem primären Ausdruck kein Leerzeichen zulässig ist.
Beschreibung:
Der Operator . wird verwendet, um ein Instanzelement aus einem Objekt oder einen Schlüssel aus einem Objekt Hashtableauszuwählen.
Der linke Operand muss ein Objekt festlegen, und der rechte Operand muss ein Element für barrierefreie Instanzen festlegen.
Der rechte Operand bezeichnet entweder ein Element für eine barrierefreie Instanz innerhalb des Typs des Objekts, das vom linken Operanden festgelegt wird, oder, wenn der linke Operand ein Array bezeichnet, der rechte Operand elemente für barrierefreie Instanzen innerhalb jedes Elements des Arrays.
Leerzeichen sind vor dem . Operator nicht zulässig.
Dieser Operator ist links assoziativ.
Der Operator :: wird verwendet, um ein statisches Element aus einem bestimmten Typ auszuwählen. Der linke Operand muss einen Typ festlegen, und der rechte Operand muss ein statisches Element innerhalb dieses Typs festlegen.
Leerzeichen sind vor dem :: Operator nicht zulässig.
Dieser Operator ist links assoziativ.
Wenn der rechte Operand eine schreibbare Position innerhalb des Typs des objekts angibt, das vom linken Operanden festgelegt wird, bestimmt der gesamte Ausdruck eine schreibbare Position.
Beispiele
$a = 10, 20, 30
$a.Length # get instance property
(10, 20, 30).Length
$property = "Length"
$a.$property # property name is a variable
$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123
}
$h1.FirstName # designates the key FirstName
$h1.Keys # gets the collection of keys
[int]::MinValue # get static property
[double]::PositiveInfinity # get static property
$property = "MinValue"
[long]::$property # property name is a variable
foreach ($t in [byte], [int], [long]) {
$t::MaxValue # get static property
}
$a = @{ID = 1 }, @{ID = 2 }, @{ID = 3 }
$a.ID # get ID from each element in the array
7.1.3 Aufrufausdrücke
Syntax:
invocation-expression:
primary-expression . new-line~opt~ member-name argument-list
primary-expression :: new-line~opt~ member-name argument-list
argument-list:
( argument-expression-list~opt~ new-lines~opt~ )
Beachten Sie, dass nach dem primären Ausdruck kein Leerzeichen zulässig ist.
Beschreibung:
Ein Aufrufausdruck ruft die von primary-expression.member-name oder primary-expression::member-name. Die Klammern in der Argumentliste enthalten eine möglicherweise leere, durch Trennzeichen getrennte Liste von Ausdrücken, die die Argumente festlegen, deren Werte an die Methode übergeben werden. Bevor die Methode aufgerufen wird, werden die Argumente nach den Regeln von §6 ausgewertet und konvertiert, um die von der Methode erwarteten Typen zu erfüllen. Die Reihenfolge der Auswertung von primary-expression.member-name, primary-expression::member-nameund die Argumente sind nicht angegeben.
Dieser Operator ist links assoziativ.
Der Typ des Ergebnisses eines Aufrufausdrucks ist ein Methodendesignator (§4.5.24).
Beispiele
[Math]::Sqrt(2.0) # call method with argument 2.0
[char]::IsUpper("a") # call method
$b = "abc#$%XYZabc"
$b.ToUpper() # call instance method
[Math]::Sqrt(2) # convert 2 to 2.0 and call method
[Math]::Sqrt(2D) # convert 2D to 2.0 and call method
[Math]::Sqrt($true) # convert $true to 1.0 and call method
[Math]::Sqrt("20") # convert "20" to 20 and call method
$a = [Math]::Sqrt # get method descriptor for Sqrt
$a.Invoke(2.0) # call Sqrt via the descriptor
$a = [Math]::("Sq"+"rt") # get method descriptor for Sqrt
$a.Invoke(2.0) # call Sqrt via the descriptor
$a = [char]::ToLower # get method descriptor for ToLower
$a.Invoke("X") # call ToLower via the descriptor
7.1.4 Elementzugriff
Syntax:
element-access:
primary-expression [ new-lines~opt~ expression new-lines~opt~ ]
Beschreibung:
Es darf keine Leerzeichen zwischen primärem Ausdruck und der linken eckigen Klammer ([) vorhanden sein.
7.1.4.1 Subscripting eines Arrays
Beschreibung:
Arrays werden in §9 ausführlich erläutert. Wenn der Ausdruck ein 1dimensionales Array ist, siehe §7.1.4.5.
Wenn der primäre Ausdruck ein 1dimensionales Array A bestimmt, gibt der Operator [] das Element zurück, das sich nach A[0 + expression] der Konvertierung intdes Ausdruckswerts befindet.
Das Ergebnis hat den Elementtyp des Arrays, das tiefgestellt wird. Wenn der Ausdruck negativ ist, wird das Element festgelegt, A[expression] das sich in A[A.Length + expression].
Wenn der primäre Ausdruck ein 2-dimensionales Array B bezeichnet, gibt der Operator [] das Element B[0 + row,0 + column] zurück, das sich hinter dem Wert der Zeilen - und Spaltenkomponenten des Ausdrucks befindet (die als durch Trennzeichen getrennte Liste angegeben werden) in int. Das Ergebnis hat den Elementtyp des Arrays, das tiefgestellt wird. Im Gegensatz zu einem 1dimensionalen Array haben negative Positionen keine besondere Bedeutung.
Wenn der primäre Ausdruck ein Array mit drei oder mehr Dimensionen angibt, gelten die Regeln für zweidimensionale Arrays, und die Dimensionspositionen werden als durch Trennzeichen getrennte Liste von Werten angegeben.
Wenn ein Lesezugriff auf ein nicht vorhandenes Element versucht wird, lautet $nulldas Ergebnis . Fehler beim Schreiben in ein nicht vorhandenes Element.
Bei einem mehrdimensionalen Subscript-Ausdruck ist die Reihenfolge der Auswertung der Bemaßungspositionsausdrücke nicht angegeben. Bei einem 3-dimensionalen Array $aist beispielsweise das Verhalten $a[$i++,$i,++$i] nicht angegeben.
Wenn ausdruck ein Array ist, siehe §7.1.4.5.
Dieser Operator ist links assoziativ.
Beispiele
$a = [int[]](10,20,30) # [int[]], Length 3
$a[1] # returns int 20
$a[20] # no such position, returns $null
$a[-1] # returns int 30, i.e., $a[$a.Length-1]
$a[2] = 5 # changes int 30 to int 5
$a[20] = 5 # implementation-defined behavior
$a = New-Object 'double[,]' 3,2
$a[0,0] = 10.5 # changes 0.0 to 10.5
$a[0,0]++ # changes 10.5 to 10.6
$list = ("red",$true,10),20,(1.2, "yes")
$list[2][1] # returns string "yes"
$a = @{ A = 10 },@{ B = $true },@{ C = 123.45 }
$a[1]["B"] # $a[1] is a Hashtable, where B is a key
$a = "red","green"
$a[1][4] # returns string "n" from string in $a[1]
Wenn ein Schreibzugriff auf ein nicht vorhandenes Element versucht wird, wird eine IndexOutOfRange-Ausnahme ausgelöst.
7.1.4.2 Tiefstellen einer Zeichenfolge
Beschreibung:
Wenn der primäre Ausdruck eine Zeichenfolge S angibt, gibt der Operator [] das Zeichen in der nullbasierten Position zurück, die durch einen Ausdruck angegeben wird, als Zeichen. Wenn der Ausdruck größer oder gleich der Länge dieser Zeichenfolge ist, lautet $nulldas Ergebnis . Wenn der Ausdruck negativ ist, wird das Element festgelegt, S[expression] das sich in S[S.Length + expression].
Beispiele
$s = "Hello" # string, Length 5, positions 0-4
$c = $s[1] # returns "e" as a string
$c = $s[20] # no such position, returns $null
$c = $s[-1] # returns "o", i.e., $s[$s.Length-1]
7.1.4.3 Subscripting a Hashtable
Beschreibung:
Wenn der primäre Ausdruck eine Hashtable angibt, gibt der Operator [] den wert(n) zurück, der mit dem durch einen Ausdruck festgelegten Schlüssel(n) verknüpft ist. Der Ausdruckstyp ist nicht eingeschränkt.
Wenn der Ausdruck ein einzelner Schlüsselname ist, ist das Ergebnis der zugeordnete Wert und hat diesen Typ, es sei denn, es ist kein solcher Schlüssel vorhanden, in diesem Fall ist $nulldas Ergebnis . Wenn $null als Schlüssel verwendet wird, wird das Verhalten definiert. Wenn der Ausdruck ein Array von Schlüsselnamen ist, lesen Sie §7.1.4.5.
Wenn ausdruck ein Array ist, siehe §7.1.4.5.
Beispiele
$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$h1['FirstName'] # the value associated with key FirstName
$h1['BirthDate'] # no such key, returns $null
$h1 = @{ 10 = "James"; 20.5 = "Anderson"; $true = 123 }
$h1[10] # returns value "James" using key 10
$h1[20.5] # returns value "Anderson" using key 20.5
$h1[$true] # returns value 123 using key $true
Wenn der Ausdruck ein einzelner Schlüsselname ist, wird eine NullArrayIndex-Ausnahme ausgelöst, wenn $null sie als einziger Wert zum Tiefstellen einer Hashtable verwendet wird.
7.1.4.4 Subscripting eines XML-Dokuments
Beschreibung:
Wenn der primäre Ausdruck ein Objekt vom Typ XML angibt, wird der Ausdruck bei Bedarf in eine Zeichenfolge konvertiert, und der Operator [] gibt das erste untergeordnete Element zurück, das den durch ausdruck angegebenen Namen aufweist. Der Ausdruckstyp muss eine Zeichenfolge sein. Der Typ des Ergebnisses wird definiert. Das Ergebnis kann tiefgestellt werden, um das erste untergeordnete Element zurückzugeben. Wenn kein untergeordnetes Element mit dem durch Ausdruck angegebenen Namen vorhanden ist, lautet $nulldas Ergebnis . Das Ergebnis gibt keine schreibbare Position an.
Beispiele
$x = [xml]@"
<Name>
<FirstName>Mary</FirstName>
<LastName>King</LastName>
</Name>
"@
$x['Name'] # refers to the element Name
$x['Name']['FirstName'] # refers to the element FirstName within Name
$x['FirstName'] # No such child element at the top level, result is $null
Der Typ des Ergebnisses ist System.Xml.XmlElement oder System.String.
7.1.4.5 Generieren von Arraysegmenten
Wenn der primäre Ausdruck ein Objekt eines Typs angibt, der aufgezählt werden kann (§4) oder eine Hashtable, und ausdruck ein 1dimensionales Array ist, handelt es sich bei dem Ergebnis um ein Arraysegment (§9.9), das die Elemente des primären Ausdrucks enthält, die durch die Elemente des Ausdrucks bestimmt werden.
Im Falle einer Hashtabelle enthält das Arraysegment die zugehörigen Werte für die bereitgestellten Schlüssel, es sei denn, es ist kein solcher Schlüssel vorhanden, in diesem Fall ist $nulldas entsprechende Element . Wenn $null als Schlüsselname verwendet wird, wird das Verhalten definiert.
Beispiele
$a = [int[]](30,40,50,60,70,80,90)
$a[1,3,5] # slice has Length 3, value 40,60,80
$a[,5] # slice with Length 1
$a[@()] # slice with Length 0
$a[-1..-3] # slice with Length 3, value 90,80,70
$a = New-Object 'int[,]' 3,2
$a[0,0] = 10; $a[0,1] = 20; $a[1,0] = 30
$a[1,1] = 40; $a[2,0] = 50; $a[2,1] = 60
$a[(0,1),(1,0)] # slice with Length 2, value 20,30, parens needed
$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$h1['FirstName'] # the value associated with key FirstName
$h1['BirthDate'] # no such key, returns $null
$h1['FirstName','IDNum'] # returns [Object[]], Length 2 (James/123)
$h1['FirstName','xxx'] # returns [Object[]], Length 2 (James/$null)
$h1[$null,'IDNum'] # returns [Object[]], Length 2 ($null/123)
Windows PowerShell: Wenn es sich bei dem Ausdruck um eine Auflistung von zwei oder mehr Schlüsselnamen handelt, wird $null dieser schlüsselname ignoriert und weist kein entsprechendes Element im resultierenden Array auf.
7.1.5 Postfix-Inkrement- und Dekrementoperatoren
Syntax:
post-increment-expression:
primary-expression ++
post-decrement-expression:
primary-expression dashdash
Beschreibung:
Der primäre Ausdruck muss eine schreibbare Position mit einem Wert vom numerischen Typ (§4) oder dem Wert $nullfestlegen. Wenn der vom Operanden festgelegte Wert ist $null, wird dieser Wert in typint und wert null konvertiert, bevor der Operator ausgewertet wird. Der Typ des durch den primären Ausdruck festgelegten Werts kann sich ändern, wenn das Ergebnis gespeichert wird. Unter §7.11 finden Sie eine Diskussion über Typänderung per Aufgabe.
Das ergebnis, das vom Postfixoperator ++ erzeugt wird, ist der vom Operanden festgelegte Wert. Nachdem dieses Ergebnis abgerufen wurde, wird der vom Operanden festgelegte Wert um 1 des entsprechenden Typs erhöht.
Der Typ des Ausdrucks E++ entspricht dem Ergebnis des Ausdrucks E + 1 (§7.7).
Das ergebnis, das vom Postfixoperator -- erzeugt wird, ist der vom Operanden festgelegte Wert. Nachdem dieses Ergebnis abgerufen wurde, wird der vom Operanden festgelegte Wert um 1 des entsprechenden Typs erhöht.
Der Typ des Ausdrucks E-- entspricht dem Ergebnis des Ausdrucks E - 1 (§7.7).
Diese Operatoren sind links assoziativ.
Beispiele
$i = 0 # $i = 0
$i++ # $i is incremented by 1
$j = $i-- # $j takes on the value of $i before the decrement
$a = 1,2,3
$b = 9,8,7
$i = 0
$j = 1
$b[$j--] = $a[$i++] # $b[1] takes on the value of $a[0], then $j is
# decremented, $i incremented
$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
[int]$k = 0 # $k is constrained to int
$k = [int]::MaxValue # $k is set to 2147483647
$k++ # 2147483648 is too big to fit, imp-def behavior
$x = $null # target is unconstrained, $null goes to [int]0
$x++ # value treated as int, 0->1
7.1,6 $(...) Operator
Syntax:
sub-expression:
$( new-lines~opt~ statement-list~opt~ new-lines~opt~ )
Beschreibung:
Wenn die Anweisungsliste nicht angegeben wird, lautet $nulldas Ergebnis . Andernfalls wird die Anweisungsliste ausgewertet. Alle Objekte, die als Teil der Auswertung in die Pipeline geschrieben werden, werden in einem nicht eingeschränkten 1dimensionalen Array in der Reihenfolge gesammelt. Wenn das Array der gesammelten Objekte leer ist, lautet $nulldas Ergebnis . Wenn das Array der gesammelten Objekte ein einzelnes Element enthält, ist das Ergebnis dieses Elements; andernfalls ist das Ergebnis das nicht eingeschränkte 1dimensionale Array der gesammelten Ergebnisse.
Beispiele
$j = 20
$($i = 10) # pipeline gets nothing
$(($i = 10)) # pipeline gets int 10
$($i = 10; $j) # pipeline gets int 20
$(($i = 10); $j) # pipeline gets [Object[]](10,20)
$(($i = 10); ++$j) # pipeline gets int 10
$(($i = 10); (++$j)) # pipeline gets [Object[]](10,22)
$($i = 10; ++$j) # pipeline gets nothing
$(2,4,6) # pipeline gets [Object[]](2,4,6)
7.1.7 @(...) Operator
Syntax:
array-expression:
@( new-lines~opt~ statement-list~opt~ new-lines~opt~ )
Beschreibung:
Wenn die Anweisungsliste nicht angegeben wird, ist das Ergebnis ein nicht eingeschränktes 1dimensionales Array der Länge Null. Andernfalls wird die Anweisungsliste ausgewertet, und alle Objekte, die als Teil der Auswertung in die Pipeline geschrieben werden, werden in einer nicht eingeschränkten 1dimensionalen Matrix in der Reihenfolge gesammelt. Das Ergebnis ist das (möglicherweise leere) nicht eingeschränkte 1dimensionale Array.
Beispiele
$j = 20
@($i = 10) # 10 not written to pipeline, result is array of 0
@(($i = 10)) # pipeline gets 10, result is array of 1
@($i = 10; $j) # 10 not written to pipeline, result is array of 1
@(($i = 10); $j) # pipeline gets 10, result is array of 2
@(($i = 10); ++$j) # pipeline gets 10, result is array of 1
@(($i = 10); (++$j)) # pipeline gets both values, result is array of 2
@($i = 10; ++$j) # pipeline gets nothing, result is array of 0
$a = @(2,4,6) # result is array of 3
@($a) # result is the same array of 3
@(@($a)) # result is the same array of 3
7.1.8 Skriptblockausdruck
Syntax:
script-block-expression:
{ new-lines~opt~ script-block new-lines~opt~ }
script-block:
param-block~opt~ statement-terminators~opt~ script-block-body~opt~
script-block-body:
named-block-list
statement-list
Beschreibung:
Param-Block wird in §8.10.9 beschrieben. benannte Blockliste wird in §8.10.7 beschrieben.
Ein Skriptblock ist ein nicht benannter Block von Anweisungen, der als einzelne Einheit verwendet werden kann. Skriptblöcke können verwendet werden, um einen Codeblock aufzurufen, als wäre es ein einzelner Befehl, oder sie können Variablen zugewiesen werden, die ausgeführt werden können.
Die Benannte Blockliste oder Anweisungsliste wird ausgeführt, und der Typ und der Wert(en) des Ergebnisses sind der Typ und die Werte der Ergebnisse dieser Anweisungssätze.
Ein Skriptblock-Ausdruck hat Typ scriptblock (§4.3.7).
Wenn param-block nicht angegeben wird, stehen alle an den Skriptblock übergebenen Argumente über $args (§8.10.1) zur Verfügung.
Während der Parameterbindung kann ein Skriptblock entweder als Skriptblockobjekt oder als Ergebnis übergeben werden, nachdem der Skriptblock ausgewertet wurde. Weitere Informationen finden Sie unter §6.17 .
7.1.9 Hashliteralausdruck
Syntax:
hash-literal-expression:
@{ new-lines~opt~ hash-literal-body~opt~ new-lines~opt~ }
hash-literal-body:
hash-entry
hash-literal-body statement-terminators hash-entry
hash-entry:
key-expression = new-lines~opt~ statement
key-expression:
simple-name
unary-expression
statement-terminators:
statement-terminator
statement-terminators statement-terminator
statement-terminator:
;
new-line-character
Beschreibung:
Ein Hash-Literal-Ausdruck wird verwendet, um eine Hashtable (§10) von Null oder mehr Elementen zu erstellen, die jeweils ein Schlüssel-Wert-Paar sind.
Der Schlüssel hat möglicherweise einen beliebigen Typ mit Ausnahme des NULL-Typs. Die zugeordneten Werte können einen beliebigen Typ aufweisen, einschließlich des NULL-Typs, und jeder dieser Werte kann ein beliebiger Ausdruck sein, der den gewünschten Wert angibt, einschließlich $null.
Die Sortierung der Schlüssel-Wert-Paare ist nicht signifikant.
Beispiele
$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$last = "Anderson"; $IDNum = 120
$h2 = @{ FirstName = "James"; LastName = $last; IDNum = $IDNum + 3 }
$h3 = @{ }
$h4 = @{ 10 = "James"; 20.5 = "Anderson"; $true = 123 }
erstellt zwei Hashtables $h1 und $h2, die jeweils drei Schlüssel-Wert-Paare enthalten, und ein Drittes, $h3das leer ist. Hashtable $h4 hat Schlüssel verschiedener Typen.
7.1.10 Typliteralausdruck
Syntax:
type-literal:
[ type-spec ]
type-spec:
array-type-name new-lines~opt~ dimension~opt~ ]
generic-type-name new-lines~opt~ generic-type-arguments ]
type-name
dimension:
,
dimension ,
generic-type-arguments:
type-spec new-lines~opt~
generic-type-arguments , new-lines~opt~ type-spec
array-type-name:
type-name [
generic-type-name:
type-name [
Beschreibung:
Ein Typliteral wird in einer Implementierung durch einen nicht angegebenen zugrunde liegenden Typ dargestellt. Daher ist ein Typname ein Synonym für den zugrunde liegenden Typ.
Typliterale werden in einer Reihe von Kontexten verwendet:
- Angeben einer expliziten Konvertierung (§6, §7.2.9)
- Erstellen eines typgeschränkten Arrays (§9.4)
- Zugreifen auf die statischen Elemente eines Objekts (§7.1.2)
- Angeben einer Typeinschränkung für eine Variable (§5.3) oder einen Funktionsparameter (§8.10.2)
Beispiele
[int].IsPrimitive # $true
[Object[]].FullName # "System.Object[]"
[int[,,]].GetArrayRank() # 3
Ein generischer Stapeltyp (§4.4), der auf Haltezeichenfolgen spezialisiert ist, kann als [Stack[string]]geschrieben werden, und ein generischer Wörterbuchtyp, der auf die Aufbewahrung int von Schlüsseln mit zugeordneten Zeichenfolgenwerten spezialisiert ist, kann als [Dictionary[int,string]]geschrieben werden.
Der Typ eines Typliterals ist System.Type. Der vollständige Name für den oben vorgeschlagenen Typ Stack[string] ist System.Collections.Generic.Stack[int]. Der vollständige Name für den oben vorgeschlagenen Typ Dictionary[int,string] ist System.Collections.Generic.Dictionary[int,string].
7.2 Unäre Betreiber
Syntax:
unary-expression:
primary-expression
expression-with-unary-operator
expression-with-unary-operator:
, new-lines~opt~ unary-expression
-not new-lines~opt~ unary-expression
! new-lines~opt~ unary-expression
-bnot new-lines~opt~ unary-expression
+ new-lines~opt~ unary-expression
dash new-lines~opt~ unary-expression
pre-increment-expression
pre-decrement-expression
cast-expression
-split new-lines~opt~ unary-expression
-join new-lines~opt~ unary-expression
pre-increment-expression:
++ new-lines~opt~ unary-expression
pre-decrement-expression:
dashdash new-lines~opt~ unary-expression
dash: one of
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
cast-expression:
type-literal unary-expression
dashdash:
dash dash
7.2.1 Unäre Kommaoperator
Beschreibung:
Der Kommaoperator (,) erstellt ein ungezwungenes 1dimensionales Array mit einem Element, dessen Typ und Wert die eines nicht är-Ausdrucks sind.
Dieser Operator ist rechtsassoziativ.
Beispiele
$a = ,10 # create an unconstrained array of 1 element, $a[0],
# which has type int
$a = ,(10,"red") # create an unconstrained array of 1 element,
$a[0],
# which is an unconstrained array of 2 elements,
# $a[0][0] an int, and $a[0][1] a string
$a = ,,10 # create an unconstrained array of 1 element, which is
# an unconstrained array of 1 element, which is an int
# $a[0][0] is the int. Contrast this with @(@(10))
7.2.2 Logische NICHT
Syntax:
logical-not-operator:
dash not
dash: one of
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
Beschreibung:
Der Operator -not wandelt den wert, der durch einen unären Ausdruck bezeichnet wird, in typ bool (§6.2) um, falls erforderlich, und erzeugt ein Ergebnis dieses Typs. Wenn der Wert eines Nicht-Ausdrucks "True" lautet, lautet das Ergebnis "False" und umgekehrt. Der Operator ! ist eine alternative Schreibweise für -not.
Dieser Operator ist rechtsassoziativ.
Beispiele
-not $true # False
-not -not $false # False
-not 0 # True
-not 1.23 # False
!"xyz" # False
7.2.3 Bitweise NICHT
Syntax:
bitwise-not-operator:
dash bnot
dash: one of
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
Beschreibung:
Der Operator -bnot wandelt den durch einen unären Ausdruck festgelegten Wert bei Bedarf in einen ganzzahligen Typ (§6.4) um. Wenn der konvertierte Wert im Typ "int " dargestellt werden kann, ist dies der Ergebnistyp. Andernfalls, wenn der konvertierte Wert in Typ long dargestellt werden kann, dann ist dies der Ergebnistyp. Andernfalls ist der Ausdruck unformiert. Der resultierende Wert ist die Ergänzung des konvertierten Werts.
Dieser Operator ist rechtsassoziativ.
Beispiele
-bnot $true # int with value 0xFFFFFFFE
-bnot 10 # int with value 0xFFFFFFF5
-bnot 2147483648.1 # long with value 0xFFFFFFFF7FFFFFFF
-bnot $null # int with value 0xFFFFFFFF
-bnot "0xabc" # int with value 0xFFFFF543
7.2.4 Unary plus
Beschreibung:
Ein Ausdruck des Formulars + unary-expression wird wie geschrieben 0 + unary-expression als (§7.7) behandelt. Das ganzzahlige Literal 0 hat Typ int.
Dieser Operator ist rechtsassoziativ.
Beispiele
+123L # type long, value 123
+0.12340D # type decimal, value 0.12340
+"0xabc" # type int, value 2748
7.2.5 Unär minus
Beschreibung:
Ein Ausdruck des Formulars - unary-expression wird wie geschrieben 0 - unary-expression als (§7.7) behandelt. Das ganzzahlige Literal 0 hat Typ int. Der Minusoperator kann eines der in §7.2 aufgeführten Gedankenstrichzeichen sein.
Dieser Operator ist rechtsassoziativ.
Beispiele
-$true # type int, value -1
-123L # type long, value -123
-0.12340D # type decimal, value -0.12340
7.2.6 Präfixoperatoren erhöhen und verringern
Beschreibung:
Der unäre Ausdruck muss eine schreibbare Position mit einem Wert vom numerischen Typ (§4) oder dem Wert $nullfestlegen. Wenn der wert, der durch seinen unären Ausdruck festgelegt ist $null, wird der Wert eines Unary-Expressions in den Typ "int" und "value zero" konvertiert, bevor der Operator ausgewertet wird.
Hinweis
Der Typ des durch unary-expression festgelegten Werts kann sich ändern, wenn das Ergebnis gespeichert wird. Unter §7.11 finden Sie eine Diskussion über Typänderung per Aufgabe.
Für den Präfixinkrementoperator ++ wird der Wert des unary-expression durch 1 den entsprechenden Typ erhöht. Das Ergebnis ist der neue Wert, nachdem inkrementiert wurde. Der Ausdruck ++E entspricht E += 1 (§7.11.2).
Für den Präfixdekrementoperator -- wird der Wert des unary-expression durch 1 den entsprechenden Typ erhöht. Das Ergebnis ist der neue Wert, nachdem die Dekrementierung erfolgt ist. Der Ausdruck --E entspricht E -= 1 (§7.11.2). Der Präfixdekrementierungsoperator kann eine der Muster sein, die mit dem Strichdashmuster in §7.2 übereinstimmen.
Diese Operatoren sind richtig assoziativ.
Beispiele
$i = 0 # $i = 0
++$i # $i is incremented by 1
$j = --$i # $i is decremented then $j takes on the value of $i
$a = 1,2,3
$b = 9,8,7
$i = 0;
$j = 1
$b[--$j] = $a[++$i] # $j is # decremented, $i incremented, then $b[0]
# takes on the value of $a[1]
$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
[int]$k = 0 # $k is constrained to int
$k = [int]::MinValue # $k is set to -2147483648
--$k # -2147483649 is too small to fit, imp-def behavior
$x = $null # target is unconstrained, $null goes to [int]0
--$x # value treated as int, 0 becomes -1
7.2.7 Der unäre -join Operator
Syntax:
join-operator:
dash join
dash: one of
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
Beschreibung:
Der unäre -join Operator erzeugt eine Zeichenfolge, die die Verkettung des Werts eines oder mehrerer Objekte darstellt, die durch unary-expression festgelegt sind. (Mithilfe der binären Version dieses Operators kann ein Trennzeichen eingefügt werden (§7.8.4.4).)
unary-expression kann ein skalarer Wert oder eine Auflistung sein.
Beispiele
-join (10, 20, 30) # result is "102030"
-join (123, $false, 19.34e17) # result is "123False1.934E+18"
-join 12345 # result is "12345"
-join $null # result is ""
7.2.8 Der unäre -split Operator
Syntax:
split-operator:
dash split
dash: one of
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
Beschreibung:
Der unäre -split Operator teilt eine oder mehrere Zeichenfolgen auf, die durch einen unären Ausdruck gekennzeichnet sind, und gibt ihre Unterparts in einem eingeschränkten 1-dimensionalen Array von Zeichenfolgen zurück. Es behandelt jede zusammenhängende Gruppe von Leerzeichen als Trennzeichen zwischen aufeinander folgenden Unterparts. Eine explizite Trennzeichenzeichenfolge kann mithilfe der binären Version dieses Operators (§7.8.4.5) oder der beiden Varianten (§7.8) angegeben werden.
Der Trennzeichentext ist nicht in den resultierenden Zeichenfolgen enthalten. Führende und nachfolgende Leerzeichen in der Eingabezeichenfolge werden ignoriert. Eine Eingabezeichenfolge, die leer ist oder Leerzeichen enthält, führt nur zu einem Array einer Zeichenfolge, die leer ist.
unary-expression kann einen skalaren Wert oder ein Array von Zeichenfolgen festlegen.
Beispiele
-split " red`tblue`ngreen " # 3 strings: "red", "blue", "green"
-split ("yes no", "up down") # 4 strings: "yes", "no", "up", "down"
-split " " # 1 (empty) string
7.2.9 Umwandlungsoperator
Beschreibung:
Dieser Operator wandelt explizit (§6) den wert, der durch unary-expression festgelegt wurde, in den typliteralen Typ (§7.1.10) um. Wenn "Type-Literal " nicht "void" ist, ist der Typ des Ergebnisses der benannte Typ, und der Wert ist der Wert nach der Konvertierung. Wenn typliteral ungültig ist, wird kein Objekt in die Pipeline geschrieben, und es gibt kein Ergebnis.
Wenn ein Ausdruck eines beliebigen Typs in denselben Typ umgeformt wird, ist der resultierende Typ und Wert der Typ und der Wert des unär-Ausdrucks.
Dieser Operator ist rechtsassoziativ.
Beispiele
[bool]-10 # a bool with value True
[int]-10.70D # a decimal with value -10
[int]10.7 # an int with value 11
[long]"+2.3e+3" # a long with value 2300
[char[]]"Hello" # an array of 5 char with values H, e, l, l, and o.
7.3 Binärer Kommaoperator
Syntax:
array-literal-expression:
unary-expression , new-lines~opt~ array-literal-expression
Beschreibung:
Der binäre Kommaoperator erstellt ein 1dimensionales Array, dessen Elemente die werte sind, die von ihren Operanden in lexikalischer Reihenfolge festgelegt werden. Das Array weist einen nicht eingeschränkten Typ auf.
Beispiele
2,4,6 # Length 3; values 2,4,6
(2,4),6 # Length 2; values [Object[]],int
(2,4,6),12,(2..4) # Length 3; [Object[]],int,[Object[]]
2,4,6,"red",$null,$true # Length 6
Das Hinzufügen von Gruppierungsklammern zu bestimmten binären Kommaausdrücken dokumentiert nicht die Standardrangfolge; Stattdessen ändert es das Ergebnis.
7.4 Bereichsoperator
Syntax:
range-expression:
unary-expression .. new-lines~opt~ unary-expression
Beschreibung:
Ein Bereichsausdruck erstellt ein nicht eingeschränktes 1dimensionales Array, dessen Elemente die Werte der int-Sequenz sind, die durch die Grenzen des Bereichs angegeben wird. Die von den Operanden festgelegten Werte werden bei Bedarf in "int" konvertiert (§6.4). Der Operand, der den niedrigeren Wert nach der Konvertierung angibt, ist die untere Grenze, während der Operand den höheren Wert nach der Konvertierung die obere Grenze angibt. Beide Grenzen können identisch sein, in diesem Fall weist das resultierende Array die Länge 1auf.
Wenn der linke Operand die untere Grenze angibt, befindet sich die Sequenz in aufsteigender Reihenfolge. Wenn der linke Operand die obere Grenze angibt, befindet sich die Sequenz in absteigender Reihenfolge.
Konzeptionell ist dieser Operator eine Verknüpfung für die entsprechende binäre Kommaoperatorsequenz. Beispielsweise kann der Bereich 5..8 auch mithilfe von 5,6,7,8. Wenn jedoch eine aufsteigende oder absteigende Sequenz erforderlich ist, ohne ein Array zu haben, kann eine Implementierung das Generieren eines tatsächlichen Arrays vermeiden. In diesem foreach ($i in 1..5) { ... }Beispiel muss kein Array erstellt werden.
Ein Bereichsausdruck kann verwendet werden, um ein Arraysegment (§9.9) anzugeben.
Beispiele
1..10 # ascending range 1..10
-495..-500 # descending range -495..-500
16..16 # sequence of 1
$x = 1.5
$x..5.40D # ascending range 2..5
$true..3 # ascending range 1..3
-2..$null # ascending range -2..0
0xf..0xa # descending range 15..10
7.5 Formatoperator
Syntax:
format-expression:
format-specification-string format-operator new-lines~opt~ range-expression
format-operator:
dash f
dash:
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
Beschreibung:
Ein Formatausdruck formatiert einen oder mehrere Werte, die nach Bereichsausdruck festgelegt sind, entsprechend einer formatspezifikationsbezogenen Zeichenfolge , die vom Formatausdruck bestimmt ist. Die Positionen der durch Bereichsausdruck festgelegten Werte werden beginnend bei Null nummeriert und in lexikalischer Reihenfolge erhöht. Das Ergebnis hat Typ string.
Eine Formatspezifikationszeichenfolge kann null oder mehr Formatspezifikationen enthalten, die jeweils das folgende Formular aufweisen:
{N [ ,M ][ : FormatString ]}
N stellt eine (erforderliche) Bereichsausdruck-Wertposition dar, M stellt die (optionale) minimale Anzeigebreite dar, und FormatString gibt das (optionale) Format an. Wenn die Breite eines formatierten Werts die angegebene Breite überschreitet, wird die Breite entsprechend erhöht. Werte, auf deren Positionen in FormatString nicht verwiesen wird, werden nach der Auswertung für alle Nebenwirkungen ignoriert. Wenn N auf eine nicht vorhandene Position verweist, wird das Verhalten definiert. Der Wert des Typs $null und "void" werden als leere Zeichenfolgen formatiert. Arrays werden als Unterausdruck formatiert (§7.1.6). Wenn Sie die Zeichen { und } in eine Formatspezifikation einschließen möchten, ohne dass sie als Formattrennzeichen interpretiert werden, schreiben Sie sie als {{ bzw }}.
Eine vollständige Definition der Formatspezifikationen finden Sie im Ecma System.IFormattableTechnical Report TR/84.
Beispiele
"__{0,3}__" -f 5 # __ 5__
"__{0,-3}__" -f 5 # __5 __
"__{0,3:000}__" -f 5 # __005__
"__{0,5:0.00}__" -f 5.0 # __ 5.00__
"__{0:C}__" -f 1234567.888 # __$1,234,567.89__
"__{0:C}__" -f -1234.56 # __($1,234.56)__
"__{0,12:e2}__" -f 123.456e2 # __ 1.23e+004__
"__{0,-12:p}__" -f -0.252 # __-25.20 % __
$i = 5; $j = 3
"__{0} + {1} <= {2}__" -f $i,$j,($i+$j) # __5 + 3 <= 8__
$format = "__0x{0:X8}__"
$format -f 65535 # __0x0000FFFF__
Wenn N in einer Formatspezifikation auf eine nicht vorhandene Position verweist, wird ein FormatError ausgelöst.
7.6 Multipliktive Operatoren
Syntax:
multiplicative-expression:
multiplicative-expression * new-lines~opt~ format-expression
multiplicative-expression / new-lines~opt~ format-expression
multiplicative-expression % new-lines~opt~ format-expression
7.6.1 Multiplikation
Beschreibung:
Das Ergebnis des Multiplikationsoperators * ist das Produkt der Werte, die von den beiden Operanden nach den üblichen arithmetischen Konvertierungen (§6.15) festgelegt wurden.
Dieser Operator ist links assoziativ.
Beispiele
12 * -10L # long result -120
-10.300D * 12 # decimal result -123.600
10.6 * 12 # double result 127.2
12 * "0xabc" # int result 32976
7.6.2 Zeichenfolgenreplikation
Beschreibung:
Wenn der linke Operand eine Zeichenfolge angibt, erstellt der binäre * Operator eine neue Zeichenfolge, die den von dem linken Operanden festgelegten Wert repliziert hat, die Anzahl der Vom wert des rechten Operanden als konvertiert in ganzzahligen Typ (§6.4).
Dieser Operator ist links assoziativ.
Beispiele
"red" * "3" # string replicated 3 times
"red" * 4 # string replicated 4 times
"red" * 0 # results in an empty string
"red" * 2.3450D # string replicated twice
"red" * 2.7 # string replicated 3 times
7.6.3 Arrayreplikation
Beschreibung:
Wenn der linke Operand ein Array angibt, erstellt der binäre * Operator ein neues, nicht eingeschränktes 1dimensionales Array, das den vom linken Operanden angegebenen Wert enthält, die Anzahl der Male repliziert, die durch den Wert des rechten Operanden als konvertiert in ganzzahligen Typ (§6.4) festgelegt wurden. Eine Replikationsanzahl von Null führt zu einem Array der Länge 1. Wenn der linke Operand ein mehrdimensionales Array angibt, wird es vor der Verwendung abgeflacht (§9.12).
Dieser Operator ist links assoziativ.
Beispiele
$a = [int[]](10,20) # [int[]], Length 2*1
$a * "3" # [Object[]], Length 2*3
$a * 4 # [Object[]], Length 2*4
$a * 0 # [Object[]], Length 2*0
$a * 2.3450D # [Object[]], Length 2*2
$a * 2.7 # [Object[]], Length 2*3
(New-Object 'float[,]' 2,3) * 2 # [Object[]], Length 2*2
7.6.4 Division
Beschreibung:
Das Ergebnis des Divisionoperators / ist der Quotient, wenn der durch den linken Operanden festgelegte Wert durch den vom rechten Operanden festgelegten Wert geteilt wird, nachdem die üblichen arithmetischen Konvertierungen (§6.15) angewendet wurden.
Wenn versucht wird, eine ganzzahlige oder dezimale Division durch Null durchzuführen, wird ein implementierungsdefinierter Beendigungsfehler ausgelöst.
Dieser Operator ist links assoziativ.
Beispiele
10/-10 # int result -1
12/-10 # double result -1.2
12/-10D # decimal result 1.2
12/10.6 # double result 1.13207547169811
12/"0xabc" # double result 0.00436681222707424
Wenn versucht wird, eine ganzzahlige oder dezimale Division durch Null durchzuführen, wird eine RuntimeException-Ausnahme ausgelöst.
7.6.5 Rest
Beschreibung:
Das Ergebnis des Restoperators % ist der Rest, wenn der durch den linken Operanden festgelegte Wert durch den vom rechten Operanden festgelegten Wert geteilt wird, nachdem die üblichen arithmetischen Konvertierungen (§6.15) angewendet wurden.
Wenn versucht wird, eine ganzzahlige oder dezimale Division durch Null durchzuführen, wird ein implementierungsdefinierter Beendigungsfehler ausgelöst.
Beispiele
10 % 3 # int result 1
10.0 % 0.3 # double result 0.1
10.00D % "0x4" # decimal result 2.00
Wenn versucht wird, eine ganzzahlige oder dezimale Division durch Null durchzuführen, wird eine RuntimeException-Ausnahme ausgelöst.
7.7 Additive Operatoren
Syntax:
additive-expression:
primary-expression + new-lines~opt~ expression
primary-expression dash new-lines~opt~ expression
dash: one of
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
7.7.1 Ergänzung
Beschreibung:
Das Ergebnis des Additionsoperators + ist die Summe der werte, die von den beiden Operanden nach der üblichen arithmetischen Konvertierung (§6.15) festgelegt wurden.
Dieser Operator ist links assoziativ.
Beispiele
12 + -10L # long result 2
-10.300D + 12 # decimal result 1.700
10.6 + 12 # double result 22.6
12 + "0xabc" # int result 2760
7.7.2 Zeichenfolgenverkettung
Beschreibung:
Wenn der linke Operand eine Zeichenfolge angibt, erstellt der binäre + Operator eine neue Zeichenfolge, die den vom linken Operanden angegebenen Wert enthält, gefolgt von den werten, die vom rechten Operanden als konvertiert in Typzeichenfolge (§6.8) festgelegt wurden.
Dieser Operator ist links assoziativ.
Beispiele
"red" + "blue" # "redblue"
"red" + "123" # "red123"
"red" + 123 # "red123"
"red" + 123.456e+5 # "red12345600"
"red" + (20,30,40) # "red20 30 40"
7.7.3 Arrayverkettung
Beschreibung:
Wenn der linke Operand ein Array angibt, erstellt der binäre + Operator ein neues, nicht eingeschränktes 1dimensionales Array, das die vom linken Operanden bezeichneten Elemente enthält, gefolgt von den Werten, die vom rechten Operanden festgelegt wurden. Mehrdimensionale Arrays, die in beiden Operanden vorhanden sind, werden vor der Verwendung abgeflacht (§9.12).
Dieser Operator ist links assoziativ.
Beispiele
$a = [int[]](10,20) # [int[]], Length 2
$a + "red" # [Object[]], Length 3
$a + 12.5,$true # [Object[]], Length 4
$a + (New-Object 'float[,]' 2,3) # [Object[]], Length 8
(New-Object 'float[,]' 2,3) + $a # [Object[]], Length 8
7.7.4 Hashtable-Verkettung
Beschreibung:
Wenn beide Operanden Hashtables festlegen, erstellt der binäre + Operator eine neue Hashtable, die die vom linken Operanden bezeichneten Elemente enthält, gefolgt von den elementen, die vom rechten Operanden festgelegt wurden.
Wenn die Hashtables denselben Schlüssel enthalten, wird ein implementierungsdefinierter Beendigungsfehler ausgelöst.
Dieser Operator ist links assoziativ.
Beispiele
$h1 = @{ FirstName = "James"; LastName = "Anderson" }
$h2 = @{ Dept = "Personnel" }
$h3 = $h1 + $h2 # new Hashtable, Count = 3
Wenn die Hashtables denselben Schlüssel enthalten, wird eine Ausnahme vom Typ BadOperatorArgument ausgelöst.
7.7.5 Subtraktion
Beschreibung:
Das Ergebnis des Subtraktionsoperators - ist die Differenz, wenn der durch den rechten Operanden angegebene Wert vom wert subtrahiert wird, der vom linken Operanden festgelegt wurde, nachdem die üblichen arithmetischen Konvertierungen (§6.15) angewendet wurden. Der Subtraktionsoperator kann eines der in §7.7 aufgeführten Gedankenstrichzeichen sein.
Dieser Operator ist links assoziativ.
Beispiele
12 - -10L # long result 22
-10.300D - 12 # decimal result -22.300
10.6 - 12 # double result -1.4
12 - "0xabc" # int result -2736
7.8 Vergleichsoperatoren
Syntax:
comparison-expression:
primary-expression comparison-operator new-lines~opt~ expression
comparison-operator:
equality-operator
relational-operator
containment-operator
type-operator
like-operator
match-operator
Beschreibung:
Der Typ des vom linken Operanden festgelegten Werts bestimmt, wie der vom rechten Operanden festgelegte Wert konvertiert wird (§6), falls erforderlich, bevor der Vergleich erfolgt.
Bei einigen Vergleichsoperatoren gibt es zwei Varianten, bei denen die Groß-/Kleinschreibung beachtet wird (-c<operator>) und bei denen die Groß-/Kleinschreibung nicht beachtet wird (-i<operator>). Die -<operator> Version entspricht -i<operator>. Die Groß-/Kleinschreibung ist nur mit Vergleichen von Werten vom Typ "Zeichenfolge" sinnvoll. In Nicht-Zeichenfolgenvergleichskontexten verhalten sich die beiden Varianten gleich.
Diese Operatoren sind links assoziativ.
7.8.1 Gleichheit und relationale Operatoren
Syntax:
equality-operator: one of
dash eq dash ceq dash ieq
dash ne dash cne dash ine
dash:
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
relational-operator: one of
dash lt dash clt dash ilt
dash le dash cle dash ile
dash gt dash cgt dash igt
dash ge dash cge dash ige
Beschreibung:
Es gibt zwei Gleichheitsoperatoren: Gleichheit (-eq) und Ungleichheit (-ne); und vier relationale Operatoren: kleiner als (-lt), kleiner als oder gleich (-le), größer als (-gt) und größer als oder gleich (-ge). Jede dieser Varianten hat zwei Varianten (§7.8).
Damit zwei Zeichenfolgen gleich verglichen werden können, müssen sie bei Bedarf die gleiche Länge und denselben Inhalt aufweisen, und die Groß-/Kleinschreibung des Buchstabens.
Wenn der vom linken Operanden festgelegte Wert keine Auflistung ist, hat das Ergebnis den Typ bool.
Andernfalls ist das Ergebnis ein möglicherweise leeres, nicht eingeschränktes 1dimensionales Array, das die Elemente der Auflistung enthält, die True im Vergleich zum vom rechten Operanden festgelegten Wert testen.
Beispiele
10 -eq "010" # True, int comparison
"010" -eq 10 # False, string comparison
"RED" -eq "Red" # True, case-insensitive comparison
"RED" -ceq "Red" # False, case-sensitive comparison
"ab" -lt "abc" # True
10,20,30,20,10 -ne 20 # 10,30,10, Length 3
10,20,30,20,10 -eq 40 # Length 0
10,20,30,20,10 -ne 40 # 10,20,30,20,10, Length 5
10,20,30,20,10 -gt 25 # 30, Length 1
0,1,30 -ne $true # 0,30, Length 2
0,"00" -eq "0" # 0 (int), Length 1
7.8.2 Eindämmungsoperatoren
Syntax:
containment-operator: one of
dash contains dash ccontains dash icontains
dash notcontains dash cnotcontains dash inotcontains
dash in dash cin dash iin
dash notin dash cnotin dash inotin
dash:
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
Beschreibung:
Es gibt vier Eindämmungsoperatoren: enthält (), enthält (-contains), in (-notcontains-in) und nicht in (-notin). Jede dieser Varianten hat zwei Varianten (§7.8).
Die Eindämmungsoperatoren geben ein Ergebnis vom Typ "bool" zurück, das angibt, ob ein Wert mindestens einmal in den Elementen eines Arrays auftritt (oder nicht auftritt). Mit -contains und -notcontains, der Wert wird durch den rechten Operanden festgelegt, und das Array wird vom linken Operanden festgelegt. Bei -in und -notinwerden die Operanden umgekehrt. Der Wert wird vom linken Operanden festgelegt, und das Array wird vom rechten Operanden festgelegt.
Wenn der Arrayopernd für diese Operatoren einen skalaren Wert aufweist, wird der Skalarwert als Array eines Elements behandelt.
Beispiele
10,20,30,20,10 -contains 20 # True
10,20,30,20,10 -contains 42.9 # False
10,20,30 -contains "10" # True
"10",20,30 -contains 10 # True
"010",20,30 -contains 10 # False
10,20,30,20,10 -notcontains 15 # True
"Red",20,30 -ccontains "RED" # False
7.8.3 Typtests und Konvertierungsoperatoren
Syntax:
type-operator: one of
dash is
dash as
dash:
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
Beschreibung:
Der Typoperator -is prüft, ob der vom linken Operanden festgelegte Wert den Typ aufweist oder von einem Typ abgeleitet wird, der den Typ aufweist, der vom rechten Operanden bestimmt ist. Der rechte Operand muss einen Typ oder einen Wert festlegen, der in einen Typ konvertiert werden kann (z. B. eine Zeichenfolge, die einen Typ benennt).
Das Ergebnis hat den Typ bool. Der Typoperator -isnot gibt die logische Negation des entsprechenden -is Formulars zurück.
Der Typoperator -as versucht, den vom linken Operanden festgelegten Wert in den vom rechten Operanden festgelegten Typ zu konvertieren. Der rechte Operand muss einen Typ oder einen Wert festlegen, der in einen Typ konvertiert werden kann (z. B. eine Zeichenfolge, die einen Typ benennt). Wenn die Konvertierung fehlschlägt, $null wird sie zurückgegeben. Andernfalls wird der konvertierte Wert zurückgegeben, und der Rückgabetyp dieses Ergebnisses ist der Laufzeittyp des konvertierten Werts.
Beispiele
$a = 10 # value 10 has type int
$a -is [int] # True
$t = [int]
$a -isnot $t # False
$a -is "int" # True
$a -isnot [double] # True
$x = [int[]](10,20)
$x -is [int[]] # True
$a = "abcd" # string is derived from object
$a -is [Object] # True
$x = [double]
foreach ($t in [int],$x,[decimal],"string") {
$b = (10.60D -as $t) * 2 # results in int 22, double 21.2
} # decimal 21.20, and string "10.6010.60"
7.8.4 Musterabgleichs- und Textbearbeitungsoperatoren
7.8.4.1 Die operatoren -like und -notlike
Syntax:
like-operator: one of
dash like dash clike dash ilike
dash notlike dash cnotlike dash inotlike
dash:
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
Beschreibung:
Wenn der linke Operand keine Auflistung angibt, hat das Ergebnis den Typ bool. Andernfalls ist das Ergebnis ein möglicherweise leeres, nicht eingeschränktes 1dimensionales Array, das die Elemente der Auflistung enthält, die True im Vergleich zum vom rechten Operanden festgelegten Wert testen. Der rechte Operand kann eine Zeichenfolge mit Platzhalterausdrücken (§3.15) festlegen. Diese Operatoren haben zwei Varianten (§7.8).
Beispiele
"Hello" -like "h*" # True, starts with h
"Hello" -clike "h*" # False, does not start with lowercase h
"Hello" -like "*l*" # True, has an l in it somewhere
"Hello" -like "??l" # False, no length match
"-abc" -like "[-xz]*" # True, - is not a range separator
"#$%\^&" -notlike "*[A-Za-z]" # True, does not end with alphabetic character
"He" -like "h[aeiou]?*" # False, need at least 3 characters
"When" -like "*[?]" # False, ? is not a wildcard character
"When?" -like "*[?]" # True, ? is not a wildcard character
"abc","abbcde","abcgh" -like "abc*" # object[2], values
"abc" and "abcgh"
7.8.4.2 Die -match und -notmatch Operatoren
Syntax:
match-operator: one of
dash match dash cmatch dash imatch
dash notmatch dash cnotmatch dash inotmatch
dash:
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
Beschreibung:
Wenn der linke Operand keine Auflistung angibt, weist das Ergebnis den Typ bool auf und wenn das Ergebnis lautet $true, werden die Elemente der Hashtable $Matches auf die Zeichenfolgen festgelegt, die mit dem vom rechten Operanden festgelegten Wert übereinstimmen (oder nicht übereinstimmen). Andernfalls ist das Ergebnis ein möglicherweise leeres, nicht eingeschränktes 1dimensionales Array, das die Elemente der Auflistung enthält, die "True" im Vergleich zum vom rechten Operanden festgelegten Wert testen und $Matches nicht festgelegt ist. Der rechte Operand kann eine Zeichenfolge mit regulären Ausdrücken (§3.16) festlegen, in diesem Fall wird sie als Muster bezeichnet. Diese Operatoren haben zwei Varianten (§7.8).
Diese Operatoren unterstützen Unterübereinstimmungen (§7.8.4.6).
Beispiele
"Hello" -match ".l" # True, $Matches key/value is 0/"el"
"Hello" -match '\^h.*o$' # True, $Matches key/value is
0/"Hello"
"Hello" -cmatch '\^h.*o$' # False, $Matches not set
"abc\^ef" -match ".\\\^e" # True, $Matches key/value is 0/"c\^e"
"abc" -notmatch "[A-Za-z]" # False
"abc" -match "[\^A-Za-z]" # False
"He" -match "h[aeiou]." # False, need at least 3 characters
"abc","abbcde","abcgh" -match "abc.*" # Length is 2, values "abc", "abcgh"
7.8.4.3 Der -replace-Operator
Syntax:
binary-replace-operator: one of
dash replace dash creplace dash ireplace
dash:
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
Beschreibung:
Der -replace Operator ermöglicht die Textersetzung in einer oder mehreren Zeichenfolgen, die vom linken Operanden mit den vom rechten Operanden festgelegten Werten festgelegt wurden. Dieser Operator hat zwei Varianten (§7.8). Der rechte Operand hat eine der folgenden Formen:
- Die zu findende Zeichenfolge, die reguläre Ausdrücke enthalten kann (§3.16). In diesem Fall ist die Ersetzungszeichenfolge implizit "".
- Ein Array von 2 Objekten, die die zu findende Zeichenfolge enthalten, gefolgt von der Ersetzungszeichenfolge.
Wenn der linke Operand eine Zeichenfolge bestimmt, weist das Ergebnis typzeichenfolge auf. Wenn der linke Operand ein 1-dimensionales Array von Zeichenfolgen bestimmt, handelt es sich bei dem Ergebnis um ein nicht eingeschränktes 1dimensionales Array, dessen Länge dem Array des linken Operanden entspricht, das die Eingabezeichenfolgen enthält, nachdem die Ersetzung abgeschlossen wurde.
Dieser Operator unterstützt Unterübereinstimmungen (§7.8.4.6).
Beispiele
"Analogous","an apple" -replace "a","*" # "*n*logous","*n *pple"
"Analogous" -creplace "[aeiou]","?" # "An?l?g??s"
"Analogous","an apple" -replace '\^a',"%%A" # "%%Analogous","%%An apple"
"Analogous" -replace "[aeiou]",'$&$&' # "AAnaaloogoouus"
7.8.4.4 Der binäre -join-Operator
Syntax:
binary-join-operator: one of
dash join
dash:
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
Beschreibung:
Der binäre -join Operator erzeugt eine Zeichenfolge, die die Verkettung des Werts eines oder mehrerer Objekte darstellt, die vom linken Operanden festgelegt wurden, nachdem sie bei Bedarf in eine Zeichenfolge (§6.7) konvertiert wurden. Die vom rechten Operanden festgelegte Zeichenfolge wird verwendet, um die (möglicherweise leeren) Werte in der resultierenden Zeichenfolge zu trennen.
Der linke Operand kann ein skalarer Wert oder eine Sammlung sein.
Beispiele
(10, 20, 30) -join "\|" # result is "10\|20\|30"
12345 -join "," # result is "12345", no separator needed
($null,$null) -join "<->" # result is "<->", two zero-length values
7.8.4.5 Der binäre -split-Operator
Syntax:
binary-split-operator: one of
dash split dash csplit dash isplit
dash:
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
Beschreibung:
Der binäre -split Operator teilt eine oder mehrere vom linken Operanden festgelegte Zeichenfolgen auf und gibt ihre Unterparts in einem eingeschränkten 1-dimensionalen Array von Zeichenfolgen zurück. Dieser Operator hat zwei Varianten (§7.8). Der linke Operand kann einen skalaren Wert oder ein Array von Zeichenfolgen festlegen. Der rechte Operand hat eine der folgenden Formen:
- Eine Trennzeichenzeichenfolge
- Ein Array von 2 Objekten mit einer Trennzeichenzeichenfolge gefolgt von einer numerischen geteilten Anzahl
- Ein Array von 3 Objekten mit einer Trennzeichenzeichenfolge, einer numerischen geteilten Anzahl und einer Optionszeichenfolge
- Ein Skriptblock
- Ein Array von 2 Objekten mit einem Skriptblock gefolgt von einer numerischen geteilten Anzahl
Die Trennzeichenzeichenfolge kann reguläre Ausdrücke (§3.16) enthalten. Sie wird verwendet, um Unterparts mit den Eingabezeichenfolgen zu finden. Das Trennzeichen ist nicht in den resultierenden Zeichenfolgen enthalten. Wenn der linke Operand eine leere Zeichenfolge angibt, führt dies zu einem leeren Zeichenfolgenelement. Wenn es sich bei der Trennzeichenzeichenfolge um eine leere Zeichenfolge handelt, wird sie an jeder Zeichenposition in den Eingabezeichenfolgen gefunden.
Standardmäßig werden alle Unterteile der Eingabezeichenfolgen als separate Elemente in das Ergebnis eingefügt. Die geteilte Anzahl kann jedoch verwendet werden, um dieses Verhalten zu ändern. Wenn diese Anzahl negativ, null oder größer als oder gleich der Anzahl von Unterteilen in einer Eingabezeichenfolge ist, wechselt jeder Teilteil in ein separates Element. Wenn diese Anzahl kleiner als die Anzahl von Unterteilen in der Eingabezeichenfolge ist, gibt es Zählungselemente im Ergebnis, wobei das letzte Element alle Unterparts enthält, die über die erste Anzahl - 1 Unterparts hinausgehen.
Eine Optionszeichenfolge enthält null oder mehr Optionsnamen mit jedem benachbarten Paar, das durch ein Komma getrennt ist. Führende, nachfolgende und eingebettete Leerzeichen werden ignoriert. Optionsnamen können in beliebiger Reihenfolge angegeben werden und groß-/kleinschreibung beachtet werden.
Wenn eine Optionszeichenfolge den Optionsnamen SimpleMatch enthält, kann sie auch den Optionsnamen IgnoreCase enthalten. Wenn eine Optionszeichenfolge den Optionsnamen RegexMatch enthält oder sie weder RegexMatch noch SimpleMatch enthält, kann sie einen beliebigen Optionsnamen außer SimpleMatch enthalten. Es darf jedoch nicht sowohl mehrline als auch Singleline enthalten.
Dies ist der Satz von Optionsnamen:
| Auswahl | Beschreibung |
|---|---|
| CultureInvariant | Ignoriert kulturelle Unterschiede in der Sprache beim Auswerten des Trennzeichens. |
| ExplicitCapture | Ignoriert nicht benannte Übereinstimmungsgruppen, sodass nur explizite Erfassungsgruppen in der Ergebnisliste zurückgegeben werden. |
| Ignorieren Sie den Fall | Erzwingen der Abgleich zwischen Groß- und Kleinschreibung, auch wenn -csplit dies verwendet wird. |
| IgnorePatternWhitespace | Ignoriert nicht gescapete Leerzeichen und Kommentare, die mit dem Nummernzeichen (#) gekennzeichnet sind. |
| Mehrzeilig | Dieser Modus erkennt den Anfang und das Ende von Zeilen und Zeichenfolgen. Der Standardmodus ist Singleline. |
| RegexMatch | Verwenden Sie den regulären Ausdrucksabgleich, um das Trennzeichen auszuwerten. Dies ist die Standardeinstellung. |
| SimpleMatch | Verwenden Sie beim Auswerten des Trennzeichens einen einfachen Zeichenfolgenvergleich. |
| Einzelzeile | Dieser Modus erkennt nur den Anfang und das Ende von Zeichenfolgen. Es ist der Standardmodus. |
Der Skriptblock (§7.1.8) gibt die Regeln zum Bestimmen des Trennzeichens an und muss den Typ Bool auswerten.
Beispiele
"one,forty two,," -split "," # 5 strings: "one" "forty two" "" ""
"abc","de" -split "" # 9 strings: "" "a" "b" "c" "" "" "d" "e" ""
"ab,cd","1,5,7,8" -split ",", 2 # 4 strings: "ab" "cd" "1" "5,7,8"
"10X20x30" -csplit "X", 0, "SimpleMatch" # 2 strings: "10" "20x30"
"analogous" -split "[AEIOU]", 0, "RegexMatch, IgnoreCase"
# 6 strings: "" "n" "l" "g" "" "s"
"analogous" -split { $_ -eq "a" -or $_ -eq "o" }, 4
# 4 strings: "" "n" "l" "gous"
7.8.4.6 Unterübereinstimmungen
Das Muster, das mit -match-notmatchKlammern abgeglichen wird, und -replace kann Unterparts (als Unterübereinstimmung bezeichnet) enthalten, die durch Klammern getrennt sind. Betrachten Sie das folgenden Beispiel:
"red" -match "red"
Das Ergebnis ist $true und der Schlüssel 0 enthält $Matches "rot", diesen Teil der Zeichenfolge, die vom linken Operanden festgelegt wurde, der genau mit dem muster übereinstimmt, das vom rechten Operanden festgelegt wurde.
Im folgenden Beispiel ist das gesamte Muster eine Unterübereinstimmung:
"red" -match "(red)"
Wie zuvor enthält Taste 0 "rot"; Schlüssel 1 enthält jedoch auch "red", d. h. einen Teil der Zeichenfolge, die vom linken Operanden bestimmt ist, der exakt mit der Unterübereinstimmung übereinstimmt.
Betrachten Sie folgendes, komplexeres Muster:
"red" -match "((r)e)(d)"
Dieses Muster ermöglicht Unterübereinstimmungen von "re", "r", "d" oder "red".
Auch hier enthält Taste 0 "rot". Schlüssel 1 enthält "re", Taste 2 enthält "r", und schlüssel 3 enthält "d". Die Schlüssel-Wert-Paare entsprechen der Reihenfolge von links nach rechts im Muster, mit längeren Zeichenfolgenvergleichen vor kürzeren.
Im Fall von -replace, kann der Ersetzungstext über Namen des Formulars $nauf die Unterübereinstimmungen zugreifen, wobei die erste Übereinstimmung ist $1, die zweite ist $3usw. Beispiel:
"Monday morning" -replace '(Monday|Tuesday) (morning|afternoon|evening)','the $2 of $1'
Die resultierende Zeichenfolge ist "der Morgen des Montags".
Anstatt Schlüssel in $Matches nullbasierten Indizes zu haben, können Unterübereinstimmungen mithilfe des Formulars ?<*name*>benannt werden. Beispielsweise "((r)e)(d)" kann mit drei benannten Unterübereinstimmungen, m1, m2und m3, wie folgt geschrieben werden: "(?<m1>(?<m2>r)e)(?<m3>d)".
7.8.5 Schichtoperatoren
Syntax:
shift-operator: one of
dash shl
dash shr
dash:
- (U+002D)
EnDash character (U+2013)
EmDash character (U+2014)
Horizontal bar character (U+2015)
Beschreibung:
Der Operator umschalt left (-shl) und shift right (-shr) wandeln den wert, der vom linken Operanden entworfen wurde, in einen ganzzahligen Typ um und den wert, der vom rechten Operanden bei Bedarf int festgelegt wird, mit den üblichen arithmetischen Konvertierungen (§6.15).
Der Operator "Umschalt nach links" verschiebt den linken Operanden um eine Reihe von Bits, die wie unten beschrieben berechnet werden. Die leeren Bitpositionen in niedriger Reihenfolge werden auf Null festgelegt.
Der Operator "Umschalt rechts" verschiebt den linken Operanden nach rechts um eine Reihe von Bits, die wie unten beschrieben berechnet werden. Die Bits mit niedriger Reihenfolge des linken Operanden werden verworfen, die verbleibenden Bits werden nach rechts verschoben. Wenn der linke Operand ein signierter Wert ist, werden die leeren Bitpositionen in hoher Reihenfolge auf Null festgelegt, wenn der linke Operand nicht negativ ist und auf einen wert festgelegt wird, wenn der linke Operand negativ ist. Wenn der linke Operand ein nicht signierter Wert ist, werden die leeren Bitpositionen in hoher Reihenfolge auf Null festgelegt.
Wenn der linke Operand "int" einzugeben hat, wird die Schichtanzahl von den fünf Bits der unteren Reihenfolge des rechten Operanden angegeben. Wenn der rechte Operand lange eingegeben hat, wird die Schichtanzahl von den sechs Bits mit niedriger Reihenfolge des rechten Operanden angegeben.
Beispiele
0x0408 -shl 1 # int with value 0x0810
0x0408 -shr 3 # int with value 0x0081
0x100000000 -shr 0xfff81 # long with value 0x80000000
7.9 Bitweise Operatoren
Syntax:
bitwise-expression:
unary-expression -band new-lines~opt~ unary-expression
unary-expression -bor new-lines~opt~ unary-expression
unary-expression -bxor new-lines~opt~ unary-expression
Beschreibung:
Der bitweise AND-Operator -band, der bitweise OR-Operator -borund der bitweise XOR-Operator -bxor konvertieren die von ihren Operanden festgelegten Werte bei Bedarf in ganzzahlige Typen mit den üblichen arithmetischen Konvertierungen (§6.15). Wenn beide Werte nach der Konvertierung den Typ "int" aufweisen, ist dies der Typ des Ergebnisses. Andernfalls haben beide Werte den Typ "long", d. h. den Typ des Ergebnisses.
Wenn ein Wert den Typ "int " hat und der andere "long" hat, ist der Typ des Ergebnisses lang.
Andernfalls ist der Ausdruck unformiert. Das Ergebnis ist das bitweise UND, bitweise ODER oder bitweise XOR bzw. bitweise XOR der möglicherweise konvertierten Operandenwerte.
Diese Operatoren sind links assoziativ. Sie sind kommutativ, wenn kein Operand einen Nebeneffekt enthält.
Beispiele
0x0F0F -band 0xFE # int with value 0xE
0x0F0F -band 0xFEL # long with value 0xE
0x0F0F -band 14.6 # long with value 0xF
0x0F0F -bor 0xFE # int with value 0xFFF
0x0F0F -bor 0xFEL # long with value 0xFFF
0x0F0F -bor 14.40D # long with value 0xF0F
0x0F0F -bxor 0xFE # int with value 0xFF1
0x0F0F -bxor 0xFEL # long with value 0xFF1
0x0F0F -bxor 14.40D # long with value 0xF01
0x0F0F -bxor 14.6 # long with value 0xF00
7.10 Logische Operatoren
Syntax:
logical-expression:
unary-expression -and new-lines~opt~ unary-expression
unary-expression -or new-lines~opt~ unary-expression
unary-expression -xor new-lines~opt~ unary-expression
Beschreibung:
Der logische AND-Operator -and wandelt die von den Operanden angegebenen Werte bei Bedarf in bool(§6.2) um. Das Ergebnis ist das logische UND der möglicherweise konvertierten Operandenwerte und hat Typ bool. Wenn der linke Operand "False" auswertet, wird der rechte Operand nicht ausgewertet.
Der logische OR-Operator -or konvertiert die werte, die von ihren Operanden boolbei Bedarf in (§6.2) festgelegt sind. Das Ergebnis ist das logische OR der möglicherweise konvertierten Operandenwerte und hat Typ bool. Wenn der linke Operand "True" auswertet, wird der rechte Operand nicht ausgewertet.
Der logische XOR-Operator -xor wandelt die von den Operanden festgelegten Werte in bool (§6.2) um. Das Ergebnis ist der logische XOR der möglicherweise konvertierten Operandenwerte und hat Typ bool.
Diese Operatoren sind links assoziativ.
Beispiele
$j = 10
$k = 20
($j -gt 5) -and (++$k -lt 15) # True -and False -> False
($j -gt 5) -and ($k -le 21) # True -and True -> True
($j++ -gt 5) -and ($j -le 10) # True -and False -> False
($j -eq 5) -and (++$k -gt 15) # False -and True -> False
$j = 10
$k = 20
($j++ -gt 5) -or (++$k -lt 15) # True -or False -> True
($j -eq 10) -or ($k -gt 15) # False -or True -> True
($j -eq 10) -or (++$k -le 20) # False -or False -> False
$j = 10
$k = 20
($j++ -gt 5) -xor (++$k -lt 15) # True -xor False -> True
($j -eq 10) -xor ($k -gt 15) # False -xor True -> True
($j -gt 10) -xor (++$k -le 25) # True -xor True -> False
7.11 Zuordnungsoperatoren
Syntax:
assignment-expression:
expression assignment-operator statement
assignment-operator: *one of
= dash = += *= /= %=
Beschreibung:
Ein Zuordnungsoperator speichert einen Wert an der schreibbaren Position, die durch einen Ausdruck festgelegt ist. Eine Erläuterung des Aufgabenbetreibers= finden Sie unter §7.11.1. Eine Erläuterung aller anderen Zuordnungsbetreiber finden Sie unter §7.11.2.
Ein Zuordnungsausdruck weist den durch einen Ausdruck festgelegten Wert auf, nachdem die Zuordnung stattgefunden hat; Dieser Zuordnungsausdruck bezeichnet jedoch keinen schreibbaren Speicherort. Wenn der Ausdruck typgeschränkt ist (§5.3), ist der in dieser Einschränkung verwendete Typ der Typ des Ergebnisses; andernfalls ist der Typ des Ergebnisses der Typ, nachdem die üblichen arithmetischen Konvertierungen (§6.15) angewendet wurden.
Dieser Operator ist rechtsassoziativ.
7.11.1 Einfache Aufgabe
Beschreibung:
Bei einfacher Zuweisung (=) ersetzt der durch eine Anweisung festgelegte Wert den in der schreibbaren Position gespeicherten Wert, der durch Ausdruck festgelegt ist. Wenn der Ausdruck jedoch einen nicht vorhandenen Schlüssel in einer Hashtable angibt, wird dieser Schlüssel der Hashtable mit einem zugeordneten Wert des von der Anweisung festgelegten Werts hinzugefügt.
Wie in der Grammatik dargestellt, kann der Ausdruck eine durch Trennzeichen getrennte Liste schreibbarer Speicherorte festlegen.
Dies wird als Mehrfachzuweisung bezeichnet. -Anweisung gibt eine Liste mit mindestens einem durch Trennzeichen getrennten Wert an. Die Kommas in beiden Operandenlisten sind Teil der Syntax für mehrfache Zuordnungen und stellen nicht den binären Kommaoperator dar. Werte werden aus der Liste entnommen, die von der Anweisung bestimmt ist, in lexikalischer Reihenfolge und in der entsprechenden schreibbaren Position gespeichert, die durch ausdrucksbezogener Ausdruck festgelegt ist. Wenn die von der Anweisung angegebene Liste weniger Werte aufweist, als schreibbare Ausdrücke vorhanden sind, übernehmen die überzählige Speicherorte den Wert $null. Wenn die von der Anweisung festgelegte Liste mehr Werte aufweist als schreibbare Ausdruckspositionen, übernehmen alle ausdrückenden Speicherorteden entsprechendenAnweisungswert, und die am besten geeignete Ausdrucksposition wird zu einem nicht eingeschränkten 1dimensionalen Array mit allen verbleibenden Anweisungswerten als Elemente.
Bei Anweisungen mit Werten (§8.1.2) kann es sich um eine Anweisung handeln.
Beispiele
$a = 20; $b = $a + 12L # $b has type long, value 22
$hypot = [Math]::Sqrt(3*3 + 4*4) # type double, value 5
$a = $b = $c = 10.20D # all have type decimal, value 10.20
$a = (10,20,30),(1,2) # type [Object[]], Length 2
[int]$x = 10.6 # type int, value 11
[long]$x = "0xabc" # type long, value 0xabc
$a = [float] # value type literal [float]
$i,$j,$k = 10,"red",$true # $i is 10, $j is "red", $k is True
$i,$j = 10,"red",$true # $i is 10, $j is [Object[]], Length 2
$i,$j = (10,"red"),$true # $i is [Object[]], Length 2, $j is True
$i,$j,$k = 10 # $i is 10, $j is $null, $k is $null
$h = @{}
[int] $h.Lower, [int] $h.Upper = -split "10 100"
$h1 = @{ FirstName = "James"; LastName = "Anderson"; IDNum = 123 }
$h1.Dept = "Finance" # adds element Finance
$h1["City"] = "New York" # adds element City
[int]$Variable:v = 123.456 # v takes on the value 123
${E:output.txt} = "a" # write text to the given file
$Env:MyPath = "X:\data\file.txt" # define the environment variable
$Function:F = { param ($a, $b) "Hello there, $a, $b" }
F 10 "red" # define and invoke a function
function Demo { "Hi there from inside Demo" }
$Alias:A = "Demo" # create alias for function Demo
A # invoke function Demo via the alias
7.11.2 Zusammengesetzte Zuordnung
Beschreibung:
Eine zusammengesetzte Zuordnung weist das Formular E1 op= E2auf und entspricht dem einfachen Zuordnungsausdruck E1 = E1 op (E2) , mit der Ausnahme, dass im Zusammengesetzten Zuordnungsfall der Ausdruck E1 nur einmal ausgewertet wird. Wenn der Ausdruck typgeschränkt ist (§5.3), ist der in dieser Einschränkung verwendete Typ der Typ des Ergebnisses; andernfalls wird der Typ des Ergebnisses durch op bestimmt.
*=Siehe §7.6.1, §7.6.2, §7.6.3; für /=, siehe §7.6.4; für %=, siehe §7.6.5; für +=, siehe §7.7.1, §7.7.2, §7.7.3; für -=, siehe §7.7.5.
Hinweis
Ein Operand, der einen nicht eingeschränkten Wert eines numerischen Typs angibt, hat möglicherweise seinen Typ durch einen Zuordnungsoperator geändert, wenn das Ergebnis gespeichert wird.
Beispiele
$a = 1234; $a *= (3 + 2) # type is int, value is 1234 * (3 + 2)
$b = 10,20,30 # $b[1] has type int, value 20
$b[1] /= 6 # $b[1] has type double, value 3.33...
$i = 0
$b = 10,20,30
$b[++$i] += 2 # side effect evaluated only once
[int]$Variable:v = 10 # v takes on the value 10
$Variable:v -= 3 # 3 is subtracted from v
${E:output.txt} = "a" # write text to the given file
${E:output.txt} += "b" # append text to the file giving ab
${E:output.txt} *= 4 # replicate ab 4 times giving abababab
7.12 Umleitungsoperatoren
Syntax:
pipeline:
expression redirections~opt~ pipeline-tail~opt~
command verbatim-command-argument~opt~ pipeline-tail~opt~
redirections:
redirection
redirections redirection
redirection:
merging-redirection-operator
file-redirection-operator redirected-file-name
redirected-file-name:
command-argument
primary-expression
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
Beschreibung:
Der Umleitungsoperator > verwendet die Standardausgabe der Pipeline und leitet sie an den Speicherort weiter, der durch umgeleiteten Dateinamen festgelegt ist und den aktuellen Inhalt dieses Speicherorts überschreibt.
Der Umleitungsoperator >> verwendet die Standardausgabe der Pipeline und leitet sie an den Speicherort weiter, der durch umgeleiteten Dateinamen angegeben ist, wobei ggf. an den aktuellen Inhalt dieses Speicherorts angefügt wird. Wenn dieser Speicherort nicht vorhanden ist, wird er erstellt.
Der Umleitungsoperator mit dem Formular n> übernimmt die Ausgabe von Stream n aus der Pipeline und leitet ihn an den Speicherort um, der durch umgeleiteten Dateinamen festgelegt ist und den aktuellen Inhalt dieses Speicherorts überschreibt.
Der Umleitungsoperator mit dem Formular n>> übernimmt die Ausgabe von Stream n aus der Pipeline und leitet ihn an den Speicherort weiter, der durch den Umleitungsdateinamen festgelegt wird, sofern vorhanden, an den aktuellen Inhalt dieses Speicherorts angefügt wird. Wenn dieser Speicherort nicht vorhanden ist, wird er erstellt.
Der Umleitungsoperator mit dem Formular m>&n schreibt die Ausgabe von Stream m an die gleiche Position wie Stream n.
Im Folgenden sind die gültigen Datenströme aufgeführt:
| Streamen | BESCHREIBUNG |
|---|---|
| 1 | Standardausgabedatenstrom |
| 2 | Fehlerausgabedatenstrom |
| 3 | Warnungsausgabedatenstrom |
| 4 | Ausführlicher Ausgabedatenstrom |
| 5 | Debuggen des Ausgabedatenstroms |
| * | Standardausgabe, Fehlerausgabe, Warnausgabe, ausführliche Ausgabe und Debugausgabedatenströme |
Die Umleitungsoperatoren 1>&2, 6>6>> und < sind für die zukünftige Verwendung reserviert.
Wenn bei der Ausgabe der Wert des umgeleiteten Dateinamens lautet $null, wird die Ausgabe verworfen.
Ordinarily, the value of an expression containing a top-level side effect is not written to the pipeline unless that expression is enclosed in a pair of parentheses. Wenn ein solcher Ausdruck jedoch der linke Operand eines Operators ist, der die Standardausgabe umleitet, wird der Wert geschrieben.
Beispiele
$i = 200 # pipeline gets nothing
$i # pipeline gets result
$i > output1.txt # result redirected to named file
++$i >> output1.txt # result appended to named file
type file1.txt 2> error1.txt # error output redirected to named file
type file2.txt 2>> error1.txt # error output appended to named file
dir -Verbose 4> verbose1.txt # verbose output redirected to named file
# Send all output to output2.txt
dir -Verbose -Debug -WarningAction Continue *> output2.txt
# error output redirected to named file, verbose output redirected
# to the same location as error output
dir -Verbose 4>&2 2> error2.txt