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.

THEMA

about_Arithmetic_Operators

KURZE BESCHREIBUNG

Beschreibt die Operatoren, die in Windows PowerShell® arithmetische Operationen durchführen.

LANGE BESCHREIBUNG

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

OPERATOR-RANGFOLGE

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].

DIVISION UND RUNDUNG

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

ADDIEREN UND MULTIPLIZIEREN VON NICHT-NUMERISCHEN TYPEN

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

ARITHMETISCHE OPERATOREN UND VARIABLEN

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

ARITHMETISCHE OPERATOREN UND BEFEHLE

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

BEISPIELE

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

BITWEISE ARITHMETIK IN WINDOWS POWERSHELL

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)

SIEHE AUCH

about_arrays

about_assignment_operators

about_comparison_operators

about_hash_tables

about_operators

about_variables

Get-Date

Get-Date

New-TimeSpan