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