THEMA
about_Arithmetic_Operators
KURZBESCHREIBUNG
Beschreibt die Operatoren, mit denen in Windows PowerShell
arithmetische Operationen ausgeführt werden.
DETAILBESCHREIBUNG
Mit arithmetischen Operatoren werden numerische Werte berechnet.
Mit einem oder mehreren arithmetischen Operatoren können Sie
Werte addieren, subtrahieren, multiplizieren und dividieren sowie
den Rest (Modulo) eines Divisionsvorgangs berechnen.
Außerdem können der Additionsoperator (+) und der Multiplikations-
operator (*) auch für Zeichenfolgen, Arrays und Hashtabellen
verwendet werden. Durch den Additionsoperator werden Eingaben
verkettet. Der Multiplikationsoperator gibt mehrere Kopien der
Eingabe zurück. Es ist sogar möglich, Objekttypen in einer
arithmetischen Anweisung zu kombinieren.
Die Methode zum Auswerten der Anweisung wird durch den Typ des
Objekts bestimmt, das im Ausdruck am weitesten links steht.
In Windows PowerShell werden die folgenden arithmetischen
Operatoren unterstützt:
Operator Beschreibung Beispiel
-------- ----------- -------
+ Addiert ganze Zahlen und 6+2
verkettet Zeichenfolgen, "Datei" + "Name"
Arrays und Hashtabellen.
- Subtrahiert einen Wert von 6-2
einem anderen Wert. (get-date).date - 1
- Wandelt eine Zahl in eine -6+2
negative Zahl um.
-4
* Multipliziert ganze Zahlen und 6*2
führt die angegebene Anzahl "w" * 3
von Kopiervorgängen für
Zeichenfolgen und Arrays aus.
/ Dividiert zwei Werte. 6/2
% Gibt den Rest eines 7%2
Divisionsvorgangs zurück.
OPERATORRANGFOLGE
Windows PowerShell verarbeitet arithmetische Operatoren in der
folgenden Reihenfolge:
Klammern ()
- (für eine negative Zahl)
*, /, %
+, - (für eine Subtraktion)
Entsprechend diesen Rangfolgeregeln werden die Ausdrücke von
Windows PowerShell von links nach rechts verarbeitet. In den
folgenden Beispielen werden die Auswirkungen der Rangfolgeregeln
veranschaulicht:
C:\PS> 3+6/3*4
11
C:\PS> 10+4/2
12
C:\PS> (10+4)/2
7
C:\PS> (3+3)/ (1+1)
3
Die Auswertungsreihenfolge von Ausdrücken in Windows PowerShell
unterscheidet sich möglicherweise von der in anderen Ihnen vertrauten
Programmier- und Skriptsprachen. Im folgenden Beispiel wird eine
komplizierte Zuweisungsanweisung veranschaulicht.
C:\PS> $a = 0
C:\PS> $b = 1,2
C:\PS> $c = -1,-2
C:\PS> $b[$a] = $c[$a++]
C:\PS> $b
1
-1
In diesem Beispiel wird der Ausdruck $a++ vor $c ausgewertet
[$a++]. Durch die Auswertung von $a++ wird der Wert von $a
geändert. Die Variable $a in $b[$a] ist gleich 1 und nicht 0,
sodass die Anweisung $b[1] einen Wert zuweist und nicht $b[0].
ADDIEREN UND MULTIPLIZIEREN NICHT NUMERISCHER WERTE
Sie können Zahlen, Zeichenfolgen, Arrays und Hashtabellen
addieren. Zahlen, Zeichenfolgen und Arrays können auch
multipliziert werden. Hashtabellen können jedoch nicht
multipliziert werden.
Wenn Sie Zeichenfolgen, Arrays oder Hashtabellen addieren, werden
die Elemente verkettet. Beim Verketten von Auflistungen (z. B.
Arrays oder Hashtabellen) wird ein neues Objekt erstellt, das die
Objekte aus beiden Auflistungen enthält. Beim Verketten von
Hashtabellen mit demselben Schlüssel tritt ein Fehler auf.
Mit den folgenden Befehlen werden z. B. zwei Arrays erstellt und
anschließend addiert:
C:\PS> $a = 1,2,3
C:\PS> $b = "A","B,"C"
C:\PS> $a + $b
1
2
3
A
B
C
Arithmetische Operationen können auch für andere Objekttypen
ausgeführt werden. Der von Windows PowerShell ausgeführte Vorgang
wird vom Microsoft .NET Framework-Typ des Objekts bestimmt, das
im Vorgang am weitesten links steht.
Windows PowerShell versucht, alle Objekte im Vorgang in den .NET
Framework-Typ des ersten
Objekts zu konvertieren. Wenn die Objekte erfolgreich konvertiert
werden, wird der Vorgang ausgeführt, der dem .NET Framework-Typ
des ersten Objekts entspricht. Wenn eines der Objekte nicht
konvertiert werden kann, tritt ein Fehler auf.
Im folgenden Beispiel wird die Verwendung des Additionsoperators
und des Multiplikationsoperators in Vorgängen veranschaulicht, in
denen verschiedene Objekttypen verarbeitet werden:
C:\PS> "Datei" + 16
Datei16
C:\PS> $array = 1,2,3
C:\PS> $array + 16
1
2
3
16
C:\PS> $array + "Datei"
1
2
3
Datei
C:\PS> "Datei" * 3
DateiDateiDatei
Da die Auswertungsmethode für Anweisungen durch das äußerste
linke Objekt bestimmt wird, sind Addition und Multiplikation in
Windows PowerShell nicht strikt kommutativ. Der Ausdruck (a + b) ist
beispielsweise nicht immer gleich (b + a), und (a * b) ist nicht
immer gleich (b * a).
Dieser Grundsatz wird in den folgenden Beispielen veranschaulicht:
C:\PS> "Datei" + 2
Datei2
C:\PS> 2 + "Datei"
Der Wert "Datei" kann nicht in den Typ "System.Int32"
konvertiert werden. Fehler: "Die Eingabezeichenfolge hat das
falsche Format."
Bei Zeile:1 Zeichen:4
+ 2 + <<<< "Datei"
C:\PS> "Datei" * 3
DateiDateiDatei
C:\PS> 3 * "Datei"
Der Wert "Datei" kann nicht in den Typ "System.Int32"
konvertiert werden. Fehler: "Die Eingabezeichenfolge hat das
falsche Format."
Bei Zeile:1 Zeichen:4
+ 3 * <<<< "Datei"
Hashtabellen sind ein etwas anderer Fall. Bei diesen ist eine
Addition möglich. Darüber hinaus können Sie eine Hashtabelle und
ein Array addieren. Es ist jedoch nicht möglich, eine Hashtabelle
und einen anderen Typ zu addieren.
In den folgenden Beispielen wird veranschaulicht, wie
Hashtabellen sowie Hashtabellen und andere Objekte addiert werden:
C:\PS> $hash1 = @{a=1; b=2; c=3}
C:\PS> $hash2 = @{c1="Server01"; c2="Server02"}
C:\PS> $hash1 + $hash2
Name Value
---- -----
c2 Server02
a 1
b 2
c1 Server01
c 3
C:\PS> $hash1 + 2
Eine Hashtabelle kann nur zu einer Hashtabelle addiert werden.
Bei Zeile:1 Zeichen:9
+ $hash1 + <<<< 2
C:\PS> 2 + $hash1
"System.Collections.Hashtable" kann nicht in "System.Int32"
konvertiert werden.
Bei Zeile:1 Zeichen:4
+ 2 + <<<< $hash1
In den folgenden Beispielen wird veranschaulicht, dass Sie eine
Hashtabelle und ein Array addieren können. Die gesamte
Hashtabelle wird als ein einziges Objekt zum Array addiert.
C:\PS> $array = 1,2,3
C:\PS> $array + $hash1
1
2
3
Name Value
---- -----
a 1
b 2
c 3
C:\PS> $sum = $array + $hash1
C:\PS> $sum.count
4
C:\PS> $sum[3]
Name Value
---- -----
a 1
b 2
c 3
PS C:\ps-test> $sum + $hash2
1
2
3
Name Value
---- -----
a 1
b 2
c 3
c2 Server02
Im folgenden Beispiel wird veranschaulicht, dass Hashtabellen mit
demselben Schlüssel nicht addiert werden können:
C:\PS> $hash1 = @{a=1; b=2; c=3}
C:\PS> $hash2 = @{c="red"}
C:\PS> $hash1 + $hash2
Ungültiges Argument für Operator '+': Element wurde bereits
hinzugefügt. Schlüssel in Wörterbuch: 'c' Hinzugefügter
Schlüssel: 'c'.
Bei Zeile:1 Zeichen:9
+ $hash1 + <<<< $hash2
Obwohl die Additionsoperatoren sehr nützlich sind, empfiehlt es sich,
Hashtabellen und Arrays mithilfe von Zuweisungsoperatoren Elemente
hinzuzufügen. Weitere Informationen finden Sie unter "about_assignment
_operators". In den folgenden Beispielen werden Elemente mithilfe des
+=-Zuweisungsoperators einem Array hinzugefügt:
C:\PS> $array
1
2
3
C:\PS> $array + "Datei"
1
2
3
Datei
C:\PS> $array
1
2
3
C:\PS> $array += "Datei"
C:\PS> $array
1
2
3
Datei
C:\PS> $hash1
Name Value
---- -----
a 1
b 2
c 3
C:\PS> $hash1 += @{e = 5}
C:\PS> $hash1
Name Value
---- -----
a 1
b 2
e 5
c 3
Windows PowerShell wählt automatisch den numerischen .NET
Framework-Typ aus, der das Ergebnis am besten ausdrückt, ohne
dass die Genauigkeit beeinträchtigt wird. Beispiel:
C:\PS> 2 + 3.1
5.1
C:\PS> (2). GetType().FullName
System.Int32
C:\PS> (2 + 3.1).GetType().FullName
System.Double
Wenn das Ergebnis eines Vorgangs für den Typ zu groß ist, wird
der Typ des Ergebnisses erweitert, sodass das Ergebnis
aufgenommen werden kann. Dies wird im folgenden Beispiel
veranschaulicht:
C:\PS> (512MB).GetType().FullName
System.Int32
C:\PS> (512MB * 512MB).GetType().FullName
System.Double
Der Typ des Ergebnisses entspricht nicht unbedingt dem Typ eines
Operanden. Im folgenden Beispiel kann der negative Wert nicht in
eine ganze Zahl ohne Vorzeichen umgewandelt werden, und die ganze
Zahl ohne Vorzeichen ist zu groß für eine Umwandlung in Int32:
C:\PS> ([int32]::minvalue + [uint32]::maxvalue).gettype().fullname
System.Int64
In diesem Beispiel kann Int64 beide Typen aufnehmen.
Der Typ "System.Decimal" stellt eine Ausnahme dar. Wenn einer der
Operand den Typ "Decimal" aufweist, weist auch das Ergebnis den
Typ "Decimal" auf. Wenn das Ergebnis für den Typ "Decimal" zu
groß ist, wird es nicht in "Double" umgewandelt. Stattdessen wird
ein Fehler ausgegeben.
C:\PS> [Decimal]::maxvalue
79228162514264337593543950335
C:\PS> [Decimal]::maxvalue + 1
Der Wert war für einen Decimal zu groß oder zu klein.
Bei Zeile:1 Zeichen:22
+ [Decimal]::maxvalue + <<<< 1
ARITHMETISCHE OPERATOREN UND VARIABLEN
Sie können arithmetische Operatoren auch mit Variablen verwenden. Die
Operatoren wirken sich auf die Werte der Variablen aus. In den
folgenden Beispielen wird die Verwendung arithmetischer Operatoren
mit Variablen veranschaulicht:
C:\PS> $intA = 6
C:\PS> $intB = 4
C:\PS> $intA + $intB
10
C:\PS> $a = "Windows "
C:\PS> $b = "PowerShell "
C:\PS> $c = 2
C:\PS> $a + $b + $c
Windows PowerShell 2
ARITHMETISCHE OPERATOREN UND BEFEHLE
In der Regel werden arithmetische Operatoren in Ausdrücken mit Zahlen,
Zeichenfolgen und Arrays verwendet. Sie können jedoch arithmetische
Operatoren auch mit Objekten verwenden, die von Befehlen
zurückgegeben werden, sowie mit den Eigenschaften dieser Objekte.
In den folgenden Beispielen wird veranschaulicht, wie
arithmetische Operatoren in Ausdrücken mit Windows PowerShell-
Befehlen verwendet werden:
C:\PS> get-date
Mittwoch, 2. Januar 2008 13:28:42
C:\PS> $day = new-timespan -day 1
C:\PS> get-date + $day
Donnerstag, 3. Januar 2008 13:34:52
C:\PS> get-process | where {($_.ws * 2) -gt 50mb}
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
1896 39 50968 30620 264 1,572.55 1104 explorer
12802 78 188468 81032 753 3,676.39 5676 OUTLOOK
660 9 36168 26956 143 12.20 988 powershell
561 14 6592 28144 110 1,010.09 496 services
3476 80 34664 26092 234 ...45.69 876 svchost
967 30 58804 59496 416 930.97 2508 WINWORD
BEISPIELE
In den folgenden Beispielen wird veranschaulicht, wie
arithmetische Operatoren in Windows PowerShell verwendet werden:
C:\PS> 1 + 1
2
C:\PS> 1 - 1
0
C:\PS> -(6 + 3)
-9
C:\PS> 6 * 2
12
C:\PS> 7 / 2
3.5
C:\PS> 7 % 2
1
C:\PS> w * 3
www
C:\PS> 3 * "w"
Der Wert "w" kann nicht in den Typ "System.Int32" konvertiert
werden. Fehler: "Die Eingabezeichenfolge hat das falsche Format."
Bei Zeile:1 Zeichen:4
+ 3 * <<<< "w"
PS C:\ps-test> "Windows" + " " + "PowerShell"
Windows PowerShell
PS C:\ps-test> $a = "Windows" + " " + "PowerShell"
PS C:\ps-test> $a
Windows PowerShell
C:\PS> $a[0]
W
C:\PS> $a = "Testdateien.txt"
C:\PS> $b = "C:\Protokolle\"
C:\PS> $b + $a
C:\Protokolle\Testdateien.txt
C:\PS> $a = 1,2,3
C:\PS> $a + 4
1
2
3
4
C:\PS> $servers = @{0 = "LocalHost"; 1 = "Server01"; 2 = "Server02"}
C:\PS> $servers + @{3 = "Server03"}
Name Value
---- -----
3 Server03
2 Server02
1 Server01
0 LocalHost
C:\PS> $servers
Name Value
---- -----
2 Server02
1 Server01
0 LocalHost
C:\PS> $servers += @{3 = "Server03"} #Zuweisungsoperator verwenden
C:\PS> $servers
Name Value
---- -----
3 Server03
2 Server02
1 Server01
0 LocalHost
SIEHE AUCH
about_arrays
about_assignment_operators
about_comparison_operators
about_hash_tables
about_operators
about_variables
Get-Date
New-TimeSpan