Freigeben über


about_Arithmetic_Operators

Kurze Beschreibung

Beschreibt die Operatoren, die Arithmetik in PowerShell ausfü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 den Rest (Modulus) eines Divisionsvorgangs zu berechnen.

Der Additionsoperator (+) und der Multiplikationsoperator (*) funktionieren auch für Zeichenfolgen, Arrays und Hashtabellen. Der Additionsoperator verkettet die Eingabe. Der Multiplikationsoperator gibt mehrere Kopien der Eingabe zurück. Sie können sogar Objekttypen in einer arithmetischen Anweisung mischen. Die Methode, die zum Auswerten der Anweisung verwendet wird, wird durch den Typ des am weitesten links stehenden Objekts im Ausdruck bestimmt.

Ab PowerShell 2.0 arbeiten alle arithmetischen Operatoren mit 64-Bit-Zahlen.

Ab PowerShell 3.0 werden die -shr -Elemente (umschaltbar nach rechts) und -shl (umschalt-links) hinzugefügt, um bitweise Arithmetik in PowerShell zu unterstützen. Die bitweisen Operatoren funktionieren nur für Ganzzahltypen.

PowerShell unterstützt die folgenden arithmetischen Operatoren:

  • Addition (+) – Fügt Zahlen hinzu, verkettet Zeichenfolgen, Arrays und Hashtabellen.

    6 + 2                        # result = 8
    "file" + "name"              # result = "filename"
    @(1, "one") + @(2.0, "two")  # result = @(1, "one", 2.0, "two")
    @{"one" = 1} + @{"two" = 2}  # result = @{"one" = 1; "two" = 2}
    
  • Subtraktion (-): Subtrahiert oder negiert Zahlen.

    6 - 2   # result = 4
    - -6    # result = 6
    (Get-Date).AddDays(-1) # Yesterday's date
    
  • Multiplikation (): Multiplikation :* Multiplikation von Zahlen oder Kopieren von Zeichenfolgen und Arrays mit der angegebenen Anzahl von Malen

    6 * 2       # result = 12
    @("!") * 4  # result = @("!","!","!","!")
    "!" * 3     # result = "!!!"
    
  • Division (/) – Dividiert Zahlen

    6 / 2  # result = 3
    
  • Modulus (%): Gibt den Rest eines Divisionsvorgangs zurück.

    7 % 2  # result = 1
    
  • Bitweises AND (-band)

    5 -band 3  # result = 1
    
  • Bitweises NOT (-bnot)

    -bnot 5  # result = -6
    
  • Bitweise OR (-bor)

    5 -bor 0x03  # result = 7
    
  • Bitweises XOR (-bxor)

    5 -bxor 3   # result = 6
    
  • Verschiebt Bits nach links (-shl)

    102 -shl 2  # result = 408
    
  • Verschiebt Bits nach rechts (-shr)

    102 -shr 2  # result = 25
    

Rangfolge der Operatoren

PowerShell verarbeitet arithmetische Operatoren in der folgenden Reihenfolge:

Rangfolge Betreiber BESCHREIBUNG
1 () Klammern
2 - Für eine negative Zahl oder einen unären Operator
3 *, /, % Für Multiplikation und Division
4 +, - Für Addition und Subtraktion
5 -band, -bnot Für bitweise Vorgänge
5 -bor, -bxor Für bitweise Vorgänge
5 -shr, -shl Für bitweise Vorgänge

PowerShell verarbeitet die Ausdrücke gemäß den Rangfolgeregeln von links nach rechts. Die folgenden Beispiele zeigen die Auswirkungen der Rangfolgeregeln:

3+6/3*4    # result = 11
3+6/(3*4)  # result = 3.5
(3+6)/3*4  # result = 12

Die Reihenfolge, in der PowerShell Ausdrücke auswertet, kann sich von anderen Programmier- und Skriptsprachen unterscheiden, die Sie verwendet haben. Das folgende Beispiel zeigt eine komplizierte Zuweisungsanweisung.

$a = 0
$b = @(1,2)
$c = @(-1,-2)

$b[$a] = $c[$a++]

In diesem Beispiel wird der Ausdruck $a++ vor $b[$a]ausgewertet. Das Auswerten $a++ ändert den Wert von $a , nachdem er in der -Anweisung $c[$a++]verwendet wird, aber bevor er in $b[$a]verwendet wird. Die Variable $a in $b[$a] entspricht 1, nicht 0. Daher weist die -Anweisung , nicht $b[0], einen Wert zu$b[1].

Der obige Code entspricht Folgendem:

$a = 0
$b = @(1,2)
$c = @(-1,-2)

$tmp = $c[$a]
$a = $a + 1
$b[$a] = $tmp

Division und Rundung

Wenn der Quotient eines Divisionsvorgangs eine ganze Zahl ist, rundet PowerShell den Wert auf die nächste ganze Zahl. Wenn der Wert ist .5, wird er auf die nächste gerade ganze Zahl gerundet.

Das folgende Beispiel zeigt den Effekt der Rundung auf die nächste gerade ganze Zahl.

PS> [int]( 5 / 2 )  # Result is rounded down
2

PS> [int]( 7 / 2 )  # Result is rounded up
4

Sie können die [Math] -Klasse verwenden, um ein anderes Rundungsverhalten zu erhalten.

PS> [int][Math]::Round(5 / 2,[MidpointRounding]::AwayFromZero)
3

PS> [int][Math]::Ceiling(5 / 2)
3

PS> [int][Math]::Floor(5 / 2)
2

Weitere Informationen finden Sie in der Math.Round-Methode .

Typkonvertierung zur Aufnahme des Ergebnisses

PowerShell wählt automatisch den numerischen .NET-Typ aus, der das Ergebnis am besten ausdrückt, ohne an Genauigkeit zu verlieren. Beispiel:

2 + 3.1
(2).GetType().FullName
(2 + 3.1).GetType().FullName
5.1
System.Int32
System.Double

Wenn das Ergebnis eines Vorgangs für den Typ zu groß ist, wird der Typ des Ergebnisses erweitert, um das Ergebnis zu berücksichtigen, wie im folgenden Beispiel gezeigt:

(512MB).GetType().FullName
(512MB * 512MB).GetType().FullName
System.Int32
System.Double

Der Typ des Ergebnisses ist nicht immer identisch mit einem der 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ß, um in umgewandelt zu Int32werden:

([int32]::minvalue + [uint32]::maxvalue).gettype().fullname
System.Int64

In diesem Beispiel Int64 können beide Typen berücksichtigt werden.

Der System.Decimal Typ ist eine Ausnahme. Wenn einer der Operanden den Decimal-Typ aufweist, lautet das Ergebnis Decimal-Typ . Jedes Ergebnis, das für den Dezimalwert zu groß ist, ist ein Fehler.

PS> [Decimal]::maxvalue
79228162514264337593543950335

PS> [Decimal]::maxvalue + 1
RuntimeException: Value was either too large or too small for a Decimal.

Potenzieller Genauigkeitsverlust

Immer wenn Sie ein Ergebnis haben, das den Bereich des Typs überschreitet, riskieren Sie, dass die Genauigkeit aufgrund der Typkonvertierung verloren geht. Wenn Sie z. B. eine ausreichend große [long] Hinzufügen hinzufügen, werden [int] die Operanden in konvertiert [double]. In diesem Beispiel 9223372036854775807 ist der Höchstwert einer [long] ganzen Zahl. Das Hinzufügen zu einem -Wert überläuft den Bereich von [long].

PS> (9223372036854775807 + 2).GetType().FullName
System.Double

Die Umwandlung des Ergebnisses in [ulong] ergibt ein ungenaues Ergebnis, da die Operanden zuerst geerciert [double] wurden.

PS> [ulong](9223372036854775807 + 2)
9223372036854775808

Wenn Sie zuerst den größeren Wert als [ulong] definieren, wird das Problem vermieden und das richtige Ergebnis erzeugt.

PS> 9223372036854775807ul + 2
9223372036854775809

Eine Überschreitung des Bereichs von [ulong] führt jedoch zu einem [double].

PS> ([ulong]::MaxValue + 1).GetType().FullName
System.Double

Bigint-Arithmetik

Wenn Sie arithmetische Operationen für [bigint] Zahlen ausführen, konvertiert PowerShell mit alle Operanden in [bigint], was zu einer Abschneidung nicht ganzzahliger Werte führt. Der Wert 1.9 wird beispielsweise in abgeschnitten1, [double] wenn er in [bigint]konvertiert wird.

PS> [bigint]1 / 1.9
1
PS> 1 / [bigint]1.9
1

Dieses Verhalten unterscheidet sich vom Verhalten anderer numerischer Typen. In diesem Beispiel führt eine [int] geteilt durch eine [double] zu einer [double]. Die Umwandlung 1.9 in ein [int] rundet den Wert auf 2.

PS> 1 / 1.9
0.526315789473684
PS> 1 / [int]1.9
0.5

Hinzufügen und Multiplizieren nicht numerischer Typen

Sie können Zahlen, Zeichenfolgen, Arrays und Hashtabellen hinzufügen. Außerdem können Sie Zahlen, Zeichenfolgen und Arrays multiplizieren. Sie können jedoch keine Hashtabellen multiplizieren.

Wenn Sie Zeichenfolgen, Arrays oder Hashtabellen hinzufügen, werden die Elemente verkettet. Wenn Sie Auflistungen verketten, z. B. Arrays oder Hashtabellen, wird ein neues Objekt erstellt, das die Objekte aus beiden Auflistungen enthält. Wenn Sie versuchen, Hashtabellen mit demselben Schlüssel zu verketten, schlägt der Vorgang fehl.

Mit den folgenden Befehlen werden beispielsweise zwei Arrays erstellt und dann hinzugefügt:

$a = 1,2,3
$b = "A","B","C"
$a + $b
1
2
3
A
B
C

Sie können auch arithmetische Operationen für Objekte verschiedener Typen ausführen. Der Vorgang, den PowerShell ausführt, wird durch den Microsoft .NET-Typ des am weitesten links stehenden Objekts im Vorgang bestimmt. PowerShell versucht, alle Objekte im Vorgang in den .NET-Typ des ersten Objekts zu konvertieren. Wenn die -Objekte erfolgreich konvertiert werden, wird der Vorgang ausgeführt, der dem .NET-Typ des ersten Objekts entspricht. Wenn keines der Objekte konvertiert werden kann, schlägt der Vorgang fehl.

Die folgenden Beispiele veranschaulichen die Verwendung der Additions- und Multiplikationsoperatoren in Vorgängen, die verschiedene Objekttypen enthalten.

$array = 1,2,3
$red = [ConsoleColor]::Red
$blue = [ConsoleColor]::Blue

"file" + 16      # result = "file16"
$array + 16      # result = 1,2,3,16
$array + "file"  # result = 1,2,3,"file"
$array * 2       # result = 1,2,3,1,2,3
"file" * 3       # result = "filefilefile"
$blue + 3        # result = Red
$red - 3         # result = Blue
$blue - $red     # result = -3
+ '123'          # result = 123

Da die Methode, die zum Auswerten von Anweisungen verwendet wird, durch das am weitesten links stehende Objekt bestimmt wird, sind Addition und Multiplikation in PowerShell nicht streng kommutativ. Beispielsweise (a + b) ist nicht immer gleich (b + a)und (ab) nicht immer gleich (ba).

Die folgenden Beispiele veranschaulichen dieses Prinzip:

PS> "file" + 16
file16

PS> 16 + "file"
InvalidArgument: can't convert value "file" to type "System.Int32". Error:
"Input string wasn't in a correct format."

Hashtabellen sind ein etwas anderer Fall. Sie können Hashtabellen einer anderen Hashtabelle hinzufügen, solange die hinzugefügten Hashtabellen keine doppelten Schlüssel aufweisen.

Im folgenden Beispiel wird gezeigt, wie Hashtabellen einander hinzugefügt werden.

$hash1 = @{a=1; b=2; c=3}
$hash2 = @{c1="Server01"; c2="Server02"}
$hash1 + $hash2
Name                           Value
----                           -----
c2                             Server02
a                              1
b                              2
c1                             Server01
c                              3

Im folgenden Beispiel wird ein Fehler ausgelöst, da einer der Schlüssel in beiden Hashtabellen dupliziert wird.

$hash1 = @{a=1; b=2; c=3}
$hash2 = @{c1="Server01"; c="Server02"}
$hash1 + $hash2
OperationStopped:
Line |
   3 |  $hash1 + $hash2
     |  ~~~~~~~~~~~~~~~
     | Item has already been added. Key in dictionary: 'c'  Key being added: 'c'

Außerdem können Sie einem Array eine Hashtabelle hinzufügen. und die gesamte Hashtabelle wird zu einem Element im Array.

$array1 = @(0, "Hello World", [datetime]::Now)
$hash1 = @{a=1; b=2}
$array2 = $array1 + $hash1
$array2
0
Hello World

Monday, June 12, 2017 3:05:46 PM

Key   : a
Value : 1
Name  : a

Key   : b
Value : 2
Name  : b

Sie können jedoch keiner Hashtabelle einen anderen Typ hinzufügen.

$hash1 + 2
InvalidOperation: A hash table can only be added to another hash table.

Obwohl die Additionsoperatoren sehr nützlich sind, verwenden Sie die Zuweisungsoperatoren, um Hashtabellen und Arrays Elemente hinzuzufügen. Weitere Informationen finden Sie unter about_assignment_operators. In den folgenden Beispielen wird der Zuweisungsoperator += verwendet, um einem Array Elemente hinzuzufügen:

$array = @()
(0..2).foreach{ $array += $_ }
$array
0
1
2

Arithmetische Operatoren und Variablen

Sie können auch arithmetische Operatoren mit Variablen verwenden. Die Operatoren handeln auf die Werte der Variablen. In den folgenden Beispielen wird die Verwendung arithmetischer Operatoren mit Variablen veranschaulicht:

PS> $intA = 6
PS> $intB = 4
PS> $intA + $intB
10

PS> $a = "Power"
PS> $b = "Shell"
PS> $a + $b
PowerShell

Arithmetische Operatoren und Befehle

In der Regel verwenden Sie die arithmetischen Operatoren in Ausdrücken mit Zahlen, Zeichenfolgen und Arrays. Sie können jedoch auch arithmetische Operatoren mit den Objekten verwenden, die befehle zurückgeben, und mit den Eigenschaften dieser Objekte.

Die folgenden Beispiele zeigen, wie die arithmetischen Operatoren in Ausdrücken mit PowerShell-Befehlen verwendet werden:

(Get-Date) + (New-TimeSpan -day 1)

Der Klammeroperator erzwingt die Auswertung des Get-Date Cmdlets und die Auswertung des New-TimeSpan -Day 1 Cmdlet-Ausdrucks in dieser Reihenfolge. Beide Ergebnisse werden dann mithilfe des + -Operators hinzugefügt.

Get-Process | Where-Object { ($_.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

Im obigen Ausdruck wird jeder Prozessarbeitsbereich ($_.ws) mit 2multipliziert, und das Ergebnis wird mit 50mb verglichen, um zu sehen, ob er größer ist.

Bitweise Operatoren

PowerShell unterstützt die bitweisen Standardoperatoren, einschließlich bitweise-AND (-band), die inklusiven und exklusiven bitweisen OR-Operatoren (-bor und -bxor), und bitweise-NOT (-bnot).

Ab PowerShell 2.0 arbeiten alle bitweisen Operatoren mit 64-Bit-Ganzzahlen.

Ab PowerShell 3.0 werden die -shr (umschalt-rechts) und -shl (umschalt-links) eingeführt, um bitweise Arithmetik in PowerShell zu unterstützen.

PowerShell unterstützt die folgenden bitweisen Operatoren.

Operator BESCHREIBUNG Ausdruck Ergebnis
-band Bitweises AND 10 -band 3 2
-bor Bitweises OR (inklusive) 10 -bor 3 11
-bxor Bitweises OR (exklusiv) 10 -bxor 3 9
-bnot Bitweises NOT -bNot 10 -11
-shl UMSCHALT NACH LINKS 102 -shl 2 408
-shr Umschalt nach rechts 102 -shr 1 51

Bitweise Operatoren wirken auf das Binärformat eines Werts. Beispielsweise ist die Bitstruktur für die Zahl 10 00001010 (basierend auf 1 Byte), und die Bitstruktur für die Zahl 3 ist 00000011. Wenn Sie einen bitweisen Operator verwenden, um 10 mit 3 zu vergleichen, werden die einzelnen Bits in jedem Byte verglichen.

Bei einem bitweisen AND-Vorgang wird das resultierende Bit nur dann auf 1 festgelegt, wenn beide Eingabebits 1 sind.

1010      (10)
0011      ( 3)
--------------  bAND
0010      ( 2)

Bei einem bitweisen OR-Vorgang (inklusive) wird das resultierende Bit auf 1 festgelegt, wenn eines oder beide Eingabebits 1 sind. Das resultierende Bit ist nur dann auf 0 festgelegt, wenn beide Eingabebits auf 0 festgelegt sind.

1010      (10)
0011      ( 3)
--------------  bOR (inclusive)
1011      (11)

Bei einem bitweisen OR-Vorgang (exklusiv) wird das resultierende Bit nur dann auf 1 festgelegt, wenn ein Eingabebit 1 ist.

1010      (10)
0011      ( 3)
--------------  bXOR (exclusive)
1001      ( 9)

Der bitweise NOT-Operator ist ein unärer Operator, der das binäre Komplement des Werts erzeugt. Ein Bit von 1 ist auf 0 und ein Bit von 0 auf 1 festgelegt.

Beispielsweise ist das binäre Komplement von 0 -1, die maximale ganze Zahl ohne Vorzeichen (0xFFFFFFFF), und das binäre Komplement von -1 ist 0.

-bNot 10
-11
0000 0000 0000 1010  (10)
------------------------- bNOT
1111 1111 1111 0101  (-11, 0xFFFFFFF5)

Bei einer bitweisen Verschiebung nach links werden alle Bits "n" Stellen nach links verschoben, wobei "n" der Wert des rechten Operanden ist. An der eins-Stelle wird eine Null eingefügt.

expression Ergebnis Binäres Ergebnis
21 -shl 0 21 0001 0101
21 -shl 1 42 0010 1010
21 -shl 2 84 0101 0100

Bei einem bitweisen Umschaltvorgang nach rechts werden alle Bits "n" stellenweise nach rechts verschoben, wobei "n" vom rechten Operanden angegeben wird. Der Shift-Right-Operator (-shr) kopiert das Vorzeichenbit an die ganz linksste Stelle, wenn ein vorzeichenierter Wert verschoben wird. Bei Werten ohne Vorzeichen wird eine Null an der ganz linken Position eingefügt.

expression Ergebnis Binary Hex
21 -shr 0 21 00010101 0x15
21 -shr 1 10 00001010 0x0A
21 -shr 2 5 00000101 0x05
21 -shr 31 0 00000000 0x00
21 -shr 32 21 00010101 0x15
21 -shr 64 21 00010101 0x15
21 -shr 65 10 00001010 0x0A
21 -shr 66 5 00000101 0x05
[int]::MaxValue -shr 1 1073741823 00111111111111111111111111111111 0x3FFFFFFF
[int]::MinValue -shr 1 -1073741824 11000000000000000000000000000000 0xC0000000
-1 -shr 1 -1 11111111111111111111111111111111 0xFFFFFFFF
(-21 -shr 1) -11 11111111111111111111111111110101 0xFFFFFFF5
(-21 -shr 2) –6 11111111111111111111111111111010 0xFFFFFFF4

Weitere Informationen