Dela via


Om aritmetiska operatorer

KORT BESKRIVNING

Beskriver operatorerna som utför aritmetik i PowerShell.

LÅNG BESKRIVNING

Aritmetiska operatorer beräknar numeriska värden. Du kan använda en eller flera aritmetiska operatorer för att lägga till, subtrahera, multiplicera och dividera värden och för att beräkna resten (modulus) av en divisionsåtgärd.

Dessutom körs additionsoperatorn (+) och multiplikationsoperatorn (*) på strängar, matriser och hash-tabeller. Additionsoperatorn sammanfogar indata. Multiplikationsoperatorn returnerar flera kopior av indata. Du kan till och med blanda objekttyper i en aritmetiksats. Den metod som används för att utvärdera -instruktionen bestäms av typen av det vänstra objektet i uttrycket.

Från och med PowerShell 2.0 fungerar alla aritmetiska operatorer med 64-bitarsnummer.

Från och med PowerShell 3.0 -shr läggs (skift-höger) och -shl (skift-vänster) till för att stödja bitvis aritmetik i PowerShell.

PowerShell stöder följande aritmetiska operatorer:

Operator Beskrivning Exempel
+ Lägger till heltal; Sammanfogar 6 + 2
strängar, matriser och hash-tabeller. "file" + "name"
@(1, "one") + @(2.0, "two")
@{"one" = 1} + @{"two" = 2}
- Subtraherar ett värde från ett annat 6 - 2
värde
- Gör ett tal till ett negativt tal -6
(Get-Date).AddDays(-1)
* Multiplicera siffror eller kopieringssträngar 6 * 2
och matriser det angivna talet @("!") * 4
gånger. "!" * 3
/ Delar upp två värden. 6 / 2
% Modulus – returnerar resten av 7 % 2
en divisionsåtgärd.
-Band Bitvis OCH 5 -band 3
-bnot Bitvis INTE -bnot 5
-bor Bitvis ELLER 5 -bor 0x03
-bxor Bitvis XOR 5 -bxor 3
-Shl Flyttar bitar till vänster 102 -shl 2
-Shr Flyttar bitar åt höger 102 -shr 2

Bitvisoperatorerna fungerar bara med heltalstyper.

OPERATORPRIORITET

PowerShell bearbetar aritmetiska operatorer i följande ordning:

Prioritet Operator Beskrivning
1 () Parentes
2 - För ett negativt tal eller en unary-operator
3 *, /, % För multiplikation och division
4 +, - För addition och subtraktion
5 -band, -bnot För bitvis åtgärder
5 -bor, -bxor För bitvis åtgärder
5 -shr, -shl För bitvis åtgärder

PowerShell bearbetar uttrycken från vänster till höger enligt prioritetsreglerna. I följande exempel visas effekten av prioritetsreglerna:

Uttryck Resultat
3+6/3*4 11
3+6/(3*4) 3.5
(3+6)/3*4 12

Den ordning i vilken PowerShell utvärderar uttryck kan skilja sig från andra programmerings- och skriptspråk som du har använt. I följande exempel visas en komplicerad tilldelningssats.

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

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

I det här exemplet utvärderas uttrycket $a++ före $b[$a]. När du utvärderar $a++ ändras värdet $a för efter att det har använts i -instruktionen $c[$a++], men innan det används i $b[$a]. Variabeln $a i $b[$a] är lika med 1, inte 0; så instruktionen tilldelar ett värde till $b[1], inte $b[0].

Koden ovan motsvarar:

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

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

DIVISION OCH AVRUNDNING

När kvoten för en divisionsåtgärd är ett heltal avrundar PowerShell värdet till närmaste heltal. När värdet är .5avrundas det till närmaste jämna heltal.

I följande exempel visas effekten av avrundning till närmaste jämna heltal.

Uttryck Resultat
[int]( 5 / 2 ) 2
[int]( 7 / 2 ) 4

Observera hur 5/2 = 2,5 avrundas till 2. Men 7/2 = 3,5 avrundas till 4.

Du kan använda [Math] klassen för att få olika avrundningsbeteende.

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

Mer information finns i metoden Math.Round .

LÄGGA TILL OCH MULTIPLICERA ICKE-NUMERISKA TYPER

Du kan lägga till tal, strängar, matriser och hash-tabeller. Och du kan multiplicera tal, strängar och matriser. Du kan dock inte multiplicera hash-tabeller.

När du lägger till strängar, matriser eller hash-tabeller sammanfogas elementen. När du sammanfogar samlingar, till exempel matriser eller hash-tabeller, skapas ett nytt objekt som innehåller objekten från båda samlingarna. Om du försöker sammanfoga hash-tabeller som har samma nyckel misslyckas åtgärden.

Följande kommandon skapar till exempel två matriser och lägger sedan till dem:

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

Du kan också utföra aritmetiska åtgärder på objekt av olika typer. Den åtgärd som PowerShell utför bestäms av Microsoft-.NET Framework typ av objektet längst till vänster i åtgärden. PowerShell försöker konvertera alla objekt i åtgärden till den .NET Framework typen av det första objektet. Om den lyckas konvertera objekten utför den den åtgärd som är lämplig för den .NET Framework typen av det första objektet. Om det inte går att konvertera något av objekten misslyckas åtgärden.

Följande exempel visar användningen av operatorerna addition och multiplikation. i åtgärder som innehåller olika objekttyper. Anta $array = 1,2,3:

Uttryck Resultat
"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

Eftersom metoden som används för att utvärdera instruktioner bestäms av objektet längst till vänster är addition och multiplikation i PowerShell inte helt kommutativa. Är till exempel (a + b) inte alltid lika med (b + a)och (ab) är inte alltid lika med (ba).

Följande exempel visar den här principen:

Uttryck Resultat
"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 + "fil"'

Hash-tabeller är ett något annorlunda skiftläge. Du kan lägga till hash-tabeller i en annan hash-tabell, så länge de tillagda hash-tabellerna inte har dubblettnycklar.

I följande exempel visas hur du lägger till hash-tabeller till varandra.

$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

I följande exempel genereras ett fel eftersom en av nycklarna dupliceras i båda hash-tabellerna.

$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

Du kan också lägga till en hash-tabell i en matris. och hela hash-tabellen blir ett objekt i matrisen.

$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

Du kan dock inte lägga till någon annan typ i en hash-tabell.

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

Även om tilläggsoperatorerna är mycket användbara kan du använda tilldelningsoperatorerna för att lägga till element i hash-tabeller och matriser. Mer information finns i about_assignment_operators. I följande exempel används += tilldelningsoperatorn för att lägga till objekt i en matris:

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

TYPKONVERTERING FÖR ATT HANTERA RESULTAT

PowerShell väljer automatiskt den .NET Framework numeriska typen som bäst uttrycker resultatet utan att förlora precisionen. Exempel:

2 + 3.1

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

Om resultatet av en åtgärd är för stort för typen utvidgas resultatets typ för att hantera resultatet, som i följande exempel:

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

Resultatets typ är inte nödvändigtvis samma som en av operanderna. I följande exempel kan det negativa värdet inte omvandlas till ett osignerat heltal och det osignerade heltalet är för stort för att omvandlas till Int32:

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

I det här exemplet Int64 kan hantera båda typerna.

Typen System.Decimal är ett undantag. Om någon av operanderna har typen Decimal blir resultatet av typen Decimal. Om resultatet är för stort för decimaltypen omvandlas det inte till Double. I stället resulterar ett fel.

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

ARITMETISKA OPERATORER OCH VARIABLER

Du kan också använda aritmetiska operatorer med variabler. Operatorerna agerar på variablernas värden. Följande exempel visar användningen av aritmetiska operatorer med variabler:

Uttryck Resultat
$intA = 6
$intB = 4
$intA + $intB
10
$a = "Power"
$b = "Shell"
$a + $b
PowerShell

ARITMETISKA OPERATORER OCH KOMMANDON

Vanligtvis använder du de aritmetiska operatorerna i uttryck med tal, strängar och matriser. Du kan dock också använda aritmetiska operatorer med de objekt som kommandon returnerar och med egenskaperna för dessa objekt.

I följande exempel visas hur du använder de aritmetiska operatorerna i uttryck med PowerShell-kommandon:

(get-date) + (new-timespan -day 1)

Parentesoperatorn tvingar utvärderingen av cmdleten get-date och utvärderingen av cmdlet-uttrycket i den new-timespan -day 1 ordningen. Båda resultaten läggs sedan till med operatorn + .

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

I uttrycket ovan multipliceras 2varje processarbetsutrymme ($_.ws) med ; och resultatet, jämfört med 50mb för att se om det är större än så.

Bitvisa operatorer

PowerShell stöder standardoperatorer för bitvis, inklusive bitvis OCH (-bAnd), inkluderande och exklusiva bitvis-OR-operatorer (-bOr och -bXor) och bitvis-NOT (-bNot).

Från och med PowerShell 2.0 fungerar alla bitvisa operatorer med 64-bitars heltal.

Från och med PowerShell 3.0 -shr introduceras (skift-höger) och -shl (skift-vänster) för att stödja bitvis aritmetik i PowerShell.

PowerShell stöder följande bitvisa operatorer.

Operator Beskrivning Uttryck Resultat
-band Bitvis OCH 10 -band 3 2
-bor Bitvis ELLER (inklusiv) 10 -bor 3 11
-bxor Bitvis ELLER (exklusivt) 10 -bxor 3 9
-bnot Bitvis INTE -bNot 10 -11
-shl Skift-vänster 102 -shl 2 408
-shr Skift-höger 102 -shr 1 51

Bitvisa operatorer fungerar i binärformatet för ett värde. Bitstrukturen för talet 10 är till exempel 00001010 (baserat på 1 byte) och bitstrukturen för talet 3 är 00000011. När du använder en bitvis operator för att jämföra 10 till 3 jämförs de enskilda bitarna i varje byte.

I en bitvis AND-åtgärd anges den resulterande biten endast till 1 när båda indatabitarna är 1.

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

I en bitvis ELLER-åtgärd (inklusiv) anges den resulterande biten till 1 när antingen eller båda indatabitarna är 1. Den resulterande biten anges endast till 0 när båda indatabitarna är inställda på 0.

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

I en bitvis ELLER-åtgärd (exklusiv) anges den resulterande biten endast till 1 när en indatabit är 1.

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

Den bitvisa NOT-operatorn är en enställig operator som producerar värdets binära komplement. Lite av 1 är inställt på 0 och lite av 0 är inställt på 1.

Det binära komplementet på 0 är till exempel -1, det maximala osignerade heltalet (0xffffffff) och det binära komplementet på -1 är 0.

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

I en bitvis skift-vänster-åtgärd flyttas alla bitar "n" till vänster, där "n" är värdet för den högra operanden. En nolla infogas på enplatsen.

När den vänstra operanden är ett heltalsvärde (32-bitars) avgör de nedre 5 bitarna av den högra operanden hur många bitar av den vänstra operanden som flyttas.

När den vänstra operanden är ett långt (64-bitars) värde avgör de lägre 6 bitarna av den högra operanden hur många bitar av den vänstra operanden som flyttas.

Uttryck Resultat Binärt resultat
21 -shl 0 21 0001 0101
21 -shl 1 42 0010 1010
21 -shl 2 84 0101 0100

I en bitvis skift-höger-åtgärd flyttas alla bitar "n" platser till höger, där "n" anges av rätt operand. Operatorn shift-right (-shr) infogar en nolla längst till vänster när du flyttar ett positivt eller osignerat värde till höger.

När den vänstra operanden är ett heltalsvärde (32-bitars) avgör de nedre 5 bitarna av den högra operanden hur många bitar av den vänstra operanden som flyttas.

När den vänstra operanden är ett långt (64-bitars) värde avgör de lägre 6 bitarna av den högra operanden hur många bitar av den vänstra operanden som flyttas.

Uttryck Resultat Binär 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

SE ÄVEN