Freigeben über


Informationen zu arithmetischen Operatoren

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.

Darüber hinaus werden der Additionsoperator (+) und der Multiplikationsoperator (*) auch für Zeichenfolgen, Arrays und Hashtabellen ausgeführt. 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.

PowerShell unterstützt die folgenden arithmetischen Operatoren:

Operator BESCHREIBUNG Beispiel
+ Fügt ganze Zahlen hinzu; Verkettet 6 + 2
Zeichenfolgen, Arrays und Hashtabellen. "file" + "name"
@(1, "one") + @(2.0, "two")
@{"one" = 1} + @{"two" = 2}
- Subtrahiert einen Wert von einem anderen 6 - 2
value
- Macht eine Zahl zu einer negativen Zahl -6
(Get-Date).AddDays(-1)
* Multiplizieren von Zahlen oder Kopieren von Zeichenfolgen 6 * 2
und arrays die angegebene Zahl @("!") * 4
von Zeiten. "!" * 3
/ Dividiert zwei Werte. 6 / 2
% Modulus : Gibt den Rest von zurück. 7 % 2
ein Divisionsvorgang.
-Band Bitweises AND 5 -band 3
-bnot Bitweises NOT -bnot 5
-Bor Bitweises OR 5 -bor 0x03
-bxor Bitweises XOR 5 -bxor 3
-Shl Verschiebt Bits nach links 102 -shl 2
-Shr Verschiebt Bits nach rechts 102 -shr 2

Die bitweisen Operatoren funktionieren nur für Ganzzahltypen.

OPERATORRANGFOLGE

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:

expression Ergebnis
3+6/3*4 11
3+6/(3*4) 3.5
(3+6)/3*4 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] ist gleich 1, nicht 0. Daher weist die -Anweisung , nicht $b[0], einen Wert zu$b[1].

Der obige Code entspricht:

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

expression Ergebnis
[int]( 5 / 2 ) 2
[int]( 7 / 2 ) 4

Beachten Sie, dass 5/2 = 2,5 auf 2 gerundet wird. Aber 7/2 = 3,5 wird auf 4 gerundet.

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

expression Ergebnis
[int][Math]::Round(5 / 2,[MidpointRounding]::AwayFromZero) 3
[int][Math]::Ceiling(5 / 2) 3
[int][Math]::Floor(5 / 2) 2

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

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. Hashtabellen können jedoch nicht multipliziert werden.

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 Framework Typ des am weitesten links stehenden Objekts im Vorgang bestimmt. 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 für den .NET Framework Typ des ersten Objekts geeignet ist. 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. Angenommen $array = 1,2,3:

expression Ergebnis
"file" + 16 file16
$array + 16 1,2,3,16
$array + "file" 1,2,3,file
$array * 2 1,2,3,1,2,3
"file" * 3 filefilefile

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

Die folgenden Beispiele veranschaulichen dieses Prinzip:

expression Ergebnis
"file" + 16 file16
16 + "file" Cannot convert value "file" to type "System.Int32".
Error: "Input string was not in a correct format."
At line:1 char:1
+ 16 + "Datei"

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.

Das folgende Beispiel zeigt, wie Sie Hashtabellen einander hinzufügen.

$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 ist.

$hash1 = @{a=1; b=2; c=3}
$hash2 = @{c1="Server01"; c="Server02"}
$hash1 + $hash2
Item has already been added. Key in dictionary: 'c'  Key being added: 'c'
At line:3 char:1
+ $hash1 + $hash2
+ ~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException

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 einer Hashtabelle jedoch keinen anderen Typ hinzufügen.

$hash1 + 2
A hash table can only be added to another hash table.
At line:3 char:1
+ $hash1 + 2

Obwohl die Additionsoperatoren sehr nützlich sind, verwenden Sie die Zuweisungsoperatoren, um Elemente zu Hashtabellen und Arrays 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..9).foreach{ $array += $_ }
$array
0
1
2

TYPKONVERTIERUNG, UM DAS ERGEBNIS ZU BERÜCKSICHTIGEN

PowerShell wählt automatisch den .NET Framework numerischen Typ aus, der das Ergebnis am besten ausdrückt, ohne die 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 unbedingt mit einem der Operanden identisch. 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 ein Operand über den Decimal-Typ verfügt, ist das Ergebnis vom Typ Decimal. Wenn das Ergebnis für den Decimal-Typ zu groß ist, wird es nicht in Double umgewandelt. Stattdessen tritt ein Fehler auf.

expression Ergebnis
[Decimal]::maxvalue 79228162514264337593543950335
[Decimal]::maxvalue + 1 Value was either too large or too small for a
Decimal.

ARITHMETISCHE OPERATOREN UND VARIABLEN

Sie können auch arithmetische Operatoren mit Variablen verwenden. Die Operatoren wirken auf die Werte der Variablen. Die folgenden Beispiele veranschaulichen die Verwendung von arithmetischen Operatoren mit Variablen:

expression Ergebnis
$intA = 6
$intB = 4
$intA + $intB
10
$a = "Power"
$b = "Shell"
$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 von Befehlen zurückgegeben werden, 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 Cmdletausdrucks in dieser Reihenfolge. Beide Ergebnisse werden dann mit dem + Operator 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 es 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 (shift-right) und -shl (shift-left) 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 Bitweise OR (inklusive) 10 -bor 3 11
-bxor Bitweise OR (exklusiv) 10 -bxor 3 9
-bnot Bitweises NOT -bNot 10 -11
-shl Umschalt nach links 102 -shl 2 408
-shr Umschalt 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.

In 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)

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

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

In einem bitweisen ODER -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, xfffffff5)

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

Wenn der linke Operand ein Ganzzahlwert (32-Bit) ist, bestimmen die unteren 5 Bits des rechten Operanden, wie viele Bits des linken Operanden verschoben werden.

Wenn der linke Operand ein Long-Wert (64 Bit) ist, bestimmen die unteren 6 Bits des rechten Operanden, wie viele Bits des linken Operanden verschoben werden.

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

In einem bitweisen Umschalt-Rechts-Vorgang werden alle Bits "n" nach rechts verschoben, wo "n" vom rechten Operanden angegeben wird. Der Shift-Right-Operator (-shr) fügt beim Verschieben eines positiven oder unsignierten Werts nach rechts eine Null ein.

Wenn der linke Operand ein Ganzzahlwert (32-Bit) ist, bestimmen die unteren 5 Bits des rechten Operanden, wie viele Bits des linken Operanden verschoben werden.

Wenn der linke Operand ein Long-Wert (64 Bit) ist, bestimmen die unteren 6 Bits des rechten Operanden, wie viele Bits des linken Operanden verschoben werden.

expression Ergebnis Binary Hex
21 -shr 0 21 0001 0101 0x15
21 -shr 1 10 0000 1010 0x0A
21 -shr 2 5 0000 0101 0x05
21 -shr 31 0 0000 0000 0x00
21 -shr 32 21 0001 0101 0x15
21 -shr 64 21 0001 0101 0x15
21 -shr 65 10 0000 1010 0x0A
21 -shr 66 5 0000 0101 0x05
[int]::MaxValue -shr 1 1073741823 0x3FFFFFFF
[int]::MinValue -shr 1 -1073741824 0xC0000000
-1 -shr 1 -1 0xFFFFFFFF

SIEHE AUCH