about_Arithmetic_Operators
Letzte Aktualisierung: Mai 2014
Betrifft: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0
Einführung hier einfügen.
about_Arithmetic_Operators
Beschreibt die Operatoren, die in Windows PowerShell® arithmetische Operationen durchführen.
Arithmetische Operatoren berechnen numerische Werte. Sie können einen oder mehrere arithmetische Operatoren verwenden, um Werte hinzuzufügen, zu subtrahieren, zu multiplizieren und zu dividieren und um den Rest (Modulo) einer Divisionsoperation zu berechnen.
Darüber hinaus funktionieren der Additionsoperator (+) und der Multiplikationsoperator (*) auch mit Zeichenfolgen, Arrays und Hash-Tabellen. Der Additionsoperator verkettet die Eingabe. Der Multiplikationsoperator gibt mehrere Kopien der Eingabe zurück. Sie können in einer arithmetischen-Anweisung sogar Objekttypen mischen. Die Methode, die zum Auswerten der Anweisung verwendet wird, wird durch den Typ des Objekts ganz links im Ausdruck bestimmt.
Ab Windows PowerShell 2.0 funktionieren alle arithmetischen Operatoren bei 64-Bit-Zahlen.
Ab Windows PowerShell 3.0 wurden die Operatoren -shr (shift-right) und -shl (shift-left) hinzugefügt, um die bitweise Arithmetik in Windows PowerShell zu unterstützen.
Windows PowerShell unterstützt die folgenden arithmetischen Operatoren:
Operator Description Example
-------- ----------- -------
+ Adds integers; concatenates strings, 6+2
arrays, and hash tables. "file" + "name"
- Subtracts one value from another 6-2
value. (get-date).date - 1
- Makes a number a negative number. -6+2
-4
* Multiplies integers; copies strings 6*2
and arrays the specified number of "w" * 3
times.
/ Divides two values. 6/2
% Returns the remainder of a division 7%2
operation.
-shl Shift-left 100 -shl 2
-shr Shift-right 100 -shr 1
Windows PowerShell verarbeitet die arithmetische Operatoren in der folgenden Reihenfolge:
Parentheses ()
- (for a negative number)
*, /, %
+, - (for subtraction)
Windows PowerShell verarbeitet die Ausdrücke von links nach rechts gemäß den Rangfolgeregeln. Die folgenden Beispiele zeigen die Auswirkung der Rangfolgeregeln:
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 Reihenfolge, in der Windows PowerShell Ausdrücke auswertet, kann sich von der in anderen Programmier- und Scripting-Sprachen unterscheiden, die Sie bisher verwendet haben. Das folgende Beispiel zeigt eine komplizierte Zuordnungsanweisung.
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++ ausgewertet, bevor $c[$a++] ausgewertet wird. Durch die Auswertung von $a++ ändert sich der Wert von $a. Die $a-Variable in $b[$a] ist gleich 1, nicht gleich 0 ist, weshalb die Anweisung $b[1] einen Wert zuweist und nicht $b[0].
Der Quotient einer Divisionsoperation eine ganze Zahl ist, rundet Windows PowerShell den Wert auf die nächste ganze Zahl. Der Wert .5 ist, wird er auf die nächste gerade ganze Zahl gerundet.
Das folgende Beispiel zeigt die Auswirkung der Rundung auf die nächste gerade ganze Zahl.
C:\PS> [int]( 5 / 2 )
2
C:\PS> [int]( 7 / 2 )
4
Sie können Zahlen, Zeichenfolgen, Arrays und Hash-Tabellen addieren. Und Sie können Zahlen, Zeichenfolgen und Arrays multiplizieren. Sie können keine jedoch Hash-Tabellen multiplizieren.
Wenn Sie Zeichenfolgen, Arrays und Hash-Tabellen addieren, werden die Elemente verkettet. Beim Verketten von Sammlungen, wie etwa Arrays oder Hash-Tabellen, wird ein neues Objekt erstellt, das die Objekte aus beiden Sammlungen enthält. Wenn Sie versuchen, Hash-Tabellen zu verketten, die über den gleichen Schlüssel verfügen, schlägt die Operation fehl.
Beispielsweise werden durch die folgenden Befehle zwei Arrays erstellt und diese dann addiert:
C:\PS> $a = 1,2,3
C:\PS> $b = "A","B","C"
C:\PS> $a + $b
1
2
3
A
B
C
Sie können auch arithmetische Operationen für Objekte unterschiedlicher Typen ausführen. Die Operation, die Windows PowerShell durchführt, richtet sich nach dem Microsoft.NET Framework-Typ des Objekts ganz links in der Operation. Windows PowerShell versucht, alle Objekte in der Operation in den .NET Framework-Typ des ersten Objekts zu konvertieren. Wenn es gelingt, die Objekte zu konvertieren, wird die Operation entsprechend dem .NET Framework-Typ des ersten Objekts durchgeführt.. Wenn es nicht gelingt, eines der Objekte zu konvertieren, schlägt die Operation fehl.
Das folgende Beispiel veranschaulicht die Verwendung der Additions- und Multiplikationsoperatoren in Operationen, die verschiedene Objekttypen enthalten:
C:\PS> "file" + 16
file16
C:\PS> $array = 1,2,3
C:\PS> $array + 16
1
2
3
16
C:\PS> $array + "file"
1
2
3
file
C:\PS> "file" * 3
filefilefile
Da die Methode, die zur Auswertung von Anweisungen verwendet wird, durch das Objekt ganz links bestimmt wird, sind Addition und Multiplikation in Windows PowerShell sind nicht unbedingt kommutativ. So gleicht z. B. (a + b) ist nicht immer (b + a), und (a * b) gleicht nicht immer (b * a).
Die folgenden Beispiele veranschaulichen dieses Prinzip:
C:\PS> "file" + 2
file2
C:\PS> 2 + "file"
Cannot convert value "file" to type "System.Int32". Error: "Input
string was not in a correct format."
At line:1 char:4
+ 2 + <<<< "file"
C:\PS> "file" * 3
filefilefile
C:\PS> 3 * "file"
Cannot convert value "file" to type "System.Int32". Error: "Input
string was not in a correct format."
At line:1 char:4
+ 3 * <<<< "file"
Hash-Tabellen sind ein etwas anderer Fall. Sie können Hash-Tabellen addieren. Und Sie können eine Hash-Tabelle zu einem Array addieren. Sie können jedoch zu einer Hash-Tabelle keinen anderen Typ addieren.
Die folgenden Beispiele zeigen, wie Hash-Tabellen untereinander und zu anderen Objekten 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
You can add another hash table only to a hash table.
At line:1 char:9
+ $hash1 + <<<< 2
C:\PS> 2 + $hash1
Cannot convert "System.Collections.Hashtable" to "System.Int32".
At line:1 char:4
+ 2 + <<<< $hash1
Die folgenden Beispiele zeigen, dass Sie eine Hash-Tabelle zu einem Array addieren können. Dabei wird die gesamte Hash-Tabelle als einzelnes 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
Das folgende Beispiel zeigt, dass Sie keine Hash-Tabellen addieren können, die den gleichen Schlüssel enthalten:
C:\PS> $hash1 = @{a=1; b=2; c=3}
C:\PS> $hash2 = @{c="red"}
C:\PS> $hash1 + $hash2
Bad argument to operator '+': Item has already been added.
Key in dictionary: 'c' Key being added: 'c'.
At line:1 char:9
+ $hash1 + <<<< $hash2
Obwohl die Additionsoperatoren sehr nützlich sind, sollten Sie die Zuweisungsoperatoren verwenden, um Elemente zu Hash-Tabellen und Arrays zu addieren. Weitere Informationen finden Sie unter „about_assignment_operators“. Die folgenden Beispiele verwenden den Zuweisungsoperator += zum Addieren von Elementen zu einem Array:
C:\PS> $array
1
2
3
C:\PS> $array + "file"
1
2
3
file
C:\PS> $array
1
2
3
C:\PS> $array += "file"
C:\PS> $array
1
2
3
file
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, der das Ergebnis ohne Genauigkeitsverlust am besten ausdrückt. Beispiel:
C:\PS> 2 + 3.1
5.1
C:\PS> (2). GetType().FullName
System.Int32
C:\PS> (2 + 3.1).GetType().FullName
System.Double
Ist das Ergebnis einer Operation zu groß für den Typ, wird der Typ des Ergebnisses erweitert, um das Ergebnis aufzunehmen, wie im folgenden Beispiel:
C:\PS> (512MB).GetType().FullName
System.Int32
C:\PS> (512MB * 512MB).GetType().FullName
System.Double
Der Typ des Ergebnisses ist nicht notwendigerweise identisch mit dem Typ von einem der Operanden. Im folgenden Beispiel kann der negative Wert nicht in eine ganze Zahl umgewandelt werden, und die ganze Zahl ohne Vorzeichen ist zu groß, um in Int32 umgewandelt zu werden:
C:\PS> ([int32]::minvalue + [uint32]::maxvalue).gettype().fullname
System.Int64
In diesem Beispiel kann Int64 beide Typen aufnehmen.
Der System.Decimal-Typ bildet eine Ausnahme. Wenn einer der Operanden den Decimal-Typ hat, dann hat auch das Ergebnis den Decimal-Typ. Wenn das Ergebnis zu groß für den Decimal-Typ ist, wird es nicht in Double umgewandelt. Stattdessen tritt ein Fehler auf.
C:\PS> [Decimal]::maxvalue
79228162514264337593543950335
C:\PS> [Decimal]::maxvalue + 1
Value was either too large or too small for a Decimal.
At line:1 char:22
+ [Decimal]::maxvalue + <<<< 1
Sie können arithmetische Operatoren auch mit Variablen verwenden. Die Operatoren wirken sich auf die Werte der Variablen aus. Die folgenden Beispiele veranschaulichen die Verwendung von arithmetischen Operatoren mit Variablen:
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 PowerShell2
In der Regel verwenden Sie die arithmetischen Operatoren in Ausdrücken mit Zahlen, Zeichenfolgen und Arrays. Allerdings können Sie arithmetische Operatoren auch mit den Objekten verwenden, die von Befehlen zurückgegeben werden, und mit den Eigenschaften dieser Objekte.
Die folgenden Beispiele zeigen, wie Sie die arithmetischen Operatoren in Ausdrücken mit Windows PowerShell-Befehlen verwenden können:
C:\PS> get-date
Wednesday, January 02, 2008 1:28:42 PM
C:\PS> $day = new-timespan -day 1
C:\PS> get-date + $day
Thursday, January 03, 2008 1:34:52 PM
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
Die folgenden Beispiele zeigen, wie Sie die arithmetischen Operatoren in Windows PowerShell verwenden können:
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"
Cannot convert value "w" to type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char: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 = "TestFiles.txt"
C:\PS> $b = "C:\Logs\"
C:\PS> $b + $a
C:\Logs\TestFiles.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"} #Use assignment operator
C:\PS> $servers
Name Value
---- -----
3 Server03
2 Server02
1 Server01
0 LocalHost
Windows PowerShell unterstützt die Operatoren -shl (shift-left) und -shr (shift-right) für die bitweise Arithmetik.
Diese Operatoren wurden mit Windows PowerShell 3.0 eingeführt.
Bei einer bitweisen shift-left-Operation werden alle Bits um „n“ Stellen nach links verschoben, wobei „n“ der Wert des rechten Operanden ist. An der ersten Stelle wird eine Null eingefügt.
Wenn der linke Operand ein Integer-Wert (32-Bit) ist, bestimmen die unteren 5 Bits des rechten Operanden, wie viele Bits des linken Operanden verschoben werden.
Wenn der linke Operand einen Long-Wert (64-Bit) ist, bestimmen die unteren 6 Bits des rechten Operanden, wie viele Bits des linken Operanden verschoben werden.
PS C:\> 21 -shl 1
42
00010101 (21)
00101010 (42)
PS C:\> 21 -shl 2
84
00010101 (21)
00101010 (42)
01010100 (84)
Bei einer bitweisen shift-right-Operation werden alle Bits um „n“ Stellen nach rechts verschoben, wobei „n“ durch den rechten Operanden angegeben wird. Der shift-right-Operator (-shr) fügt eine Null an der äußerst linken Stelle ein, wenn ein positiver Wert oder ein Wert ohne Vorzeichen nach rechts verschoben wird.
Wenn der linke Operand ein Integer-Wert (32-Bit) ist, bestimmen die unteren 5 Bits des rechten Operanden, wie viele Bits des linken Operanden verschoben werden.
Wenn der linke Operand einen Long-Wert (64-Bit) ist, bestimmen die unteren 6 Bits des rechten Operanden, wie viele Bits des linken Operanden verschoben werden.
PS C:\> 21 -shr 1
10
00010101 (21)
00001010 (10)
PS C:\> 21 -shr 2
5
00010101 (21)
00001010 (10)
00000101 ( 5)
about_arrays
about_assignment_operators
about_comparison_operators
about_hash_tables
about_operators
about_variables
Get-Date
Get-Date
New-TimeSpan