about_Arithmetic_Operators
Krátký popis
Popisuje operátory, které provádějí aritmetické operace v PowerShellu.
Dlouhý popis
Aritmetické operátory vypočítají číselné hodnoty. Pomocí jednoho nebo více aritmetických operátorů můžete sčítat, odčítat, násobit a dělit hodnoty a vypočítat zbytek operace dělení (moduly).
Operátor sčítání (+
) a operátor násobení (*
) také pracují s řetězci, poli a hashtables. Operátor sčítání zřetězí vstup.
Operátor násobení vrátí více kopií vstupu. V aritmetickém příkazu můžete dokonce kombinovat typy objektů. Metoda, která se používá k vyhodnocení příkazu, je určena typem levého objektu ve výrazu.
Počínaje PowerShellem 2.0 fungují všechny aritmetické operátory na 64bitových číslech.
Počínaje PowerShellem 3.0 -shr
se přidávají (shift-right) a -shl
(shift-left) pro podporu bitových aritmetik v PowerShellu. Bitové operátory pracují pouze na celočíselné typy.
PowerShell podporuje následující aritmetické operátory:
Sčítání (
+
) – sčítání čísel, zřetězení řetězců, polí a hashovacích tabulek6 + 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}
Odčítání (
-
) – odečítá nebo negates čísla6 - 2 # result = 4 - -6 # result = 6 (Get-Date).AddDays(-1) # Yesterday's date
Násobení (
*
) – Násobení čísel nebo kopírování řetězců a polí zadaný početkrát6 * 2 # result = 12 @("!") * 4 # result = @("!","!","!","!") "!" * 3 # result = "!!!"
Dělení (
/
) – vyděluje čísla.6 / 2 # result = 3
Moduls (
%
) – vrátí zbytek operace dělení.7 % 2 # result = 1
Bitový operátor AND (
-band
)5 -band 3 # result = 1
Bitové NOT (
-bnot
)-bnot 5 # result = -6
Bitový operátor OR (
-bor
)5 -bor 0x03 # result = 7
Bitový XOR (
-bxor
)5 -bxor 3 # result = 6
Posune bity doleva (
-shl
)102 -shl 2 # result = 408
Posune bity doprava (
-shr
)102 -shr 2 # result = 25
Priorita operátorů
PowerShell zpracovává aritmetické operátory v následujícím pořadí:
Pořadí podle priority | Operátor | Popis |
---|---|---|
1 | () |
Závorky |
2 | - |
Záporné číslo nebo unární operátor |
3 |
* , , / % |
Pro násobení a dělení |
4 |
+ , - |
Pro sčítání a odčítání |
5 |
-band , -bnot |
Pro bitové operace |
5 |
-bor , -bxor |
Pro bitové operace |
5 |
-shr , -shl |
Pro bitové operace |
PowerShell zpracovává výrazy zleva doprava podle pravidel priority. Následující příklady ukazují účinek pravidel priority:
3+6/3*4 # result = 11
3+6/(3*4) # result = 3.5
(3+6)/3*4 # result = 12
Pořadí, ve kterém PowerShell vyhodnocuje výrazy, se může lišit od jiných programovacích a skriptových jazyků, které jste použili. Následující příklad ukazuje složitý příkaz přiřazení.
$a = 0
$b = @(1,2)
$c = @(-1,-2)
$b[$a] = $c[$a++]
V tomto příkladu je výraz $a++
vyhodnocen před $b[$a]
. Vyhodnocení $a++
změní hodnotu $a
poté, co se použije v příkazu $c[$a++]
, ale předtím, než se použije v $b[$a]
. Proměnná $a
se $b[$a]
rovná 1
, ne 0
. Proto příkaz přiřadí hodnotu $b[1]
, nikoli $b[0]
.
Výše uvedený kód odpovídá:
$a = 0
$b = @(1,2)
$c = @(-1,-2)
$tmp = $c[$a]
$a = $a + 1
$b[$a] = $tmp
Dělení a zaokrouhlování
Pokud je podíl operace dělení celé číslo, PowerShell zaokrouhlí hodnotu na nejbližší celé číslo. Pokud je .5
hodnota , zaokrouhlí se na nejbližší sudé celé číslo.
Následující příklad ukazuje efekt zaokrouhlení na nejbližší sudé celé číslo.
PS> [int]( 5 / 2 ) # Result is rounded down
2
PS> [int]( 7 / 2 ) # Result is rounded up
4
Třídu můžete použít k získání jiného [Math]
chování zaokrouhlování.
PS> [int][Math]::Round(5 / 2,[MidpointRounding]::AwayFromZero)
3
PS> [int][Math]::Ceiling(5 / 2)
3
PS> [int][Math]::Floor(5 / 2)
2
Další informace naleznete v metodě Math.Round .
Převod typu pro přizpůsobení výsledku
PowerShell automaticky vybere číselný typ .NET, který nejlépe vyjadřuje výsledek bez ztráty přesnosti. Příklad:
2 + 3.1
(2).GetType().FullName
(2 + 3.1).GetType().FullName
5.1
System.Int32
System.Double
Pokud je výsledek operace pro typ příliš velký, je typ výsledku rozšířen tak, aby vyhovoval výsledku, jako v následujícím příkladu:
(512MB).GetType().FullName
(512MB * 512MB).GetType().FullName
System.Int32
System.Double
Typ výsledku není vždy stejný jako jeden z operandů. V následujícím příkladu nelze přetypovat zápornou hodnotu na celé číslo bez znaménka a celé číslo bez znaménka je příliš velké, aby bylo možné přetypovat na Int32
:
([int32]::minvalue + [uint32]::maxvalue).GetType().FullName
System.Int64
V tomto příkladu Int64
lze použít oba typy.
Typ System.Decimal
je výjimka. Pokud má některý operand typ Desetinné číslo , je výsledkem typ Desetinné číslo . Jakýkoli výsledek je pro desetinnou hodnotu příliš velký.
PS> [Decimal]::maxvalue
79228162514264337593543950335
PS> [Decimal]::maxvalue + 1
RuntimeException: Value was either too large or too small for a Decimal.
Potenciální ztráta přesnosti
Kdykoli máte výsledek, který překračuje rozsah typu, riskujete ztrátu přesnosti z důvodu převodu typu. Například přidáním dostatečně velkého [long]
operandu a [int]
výsledkem je převod operandů na [double]
. V tomto příkladu 9223372036854775807
je maximální hodnota celého čísla [long]
.
Přidání k hodnotě přeteče rozsahu [long]
.
PS> (9223372036854775807 + 2).GetType().FullName
System.Double
Přetypování výsledku tak, aby [ulong]
přinesl nepřesný výsledek, protože operandy byly nejprve přetěžovány na [double]
první.
PS> [ulong](9223372036854775807 + 2)
9223372036854775808
Definování větší hodnoty jako [ulong]
první zabrání problému a vytvoří správný výsledek.
PS> 9223372036854775807ul + 2
9223372036854775809
Avšak překročení rozsahu [ulong]
výsledků v [double]
.
PS> ([ulong]::MaxValue + 1).GetType().FullName
System.Double
Bigint aritmetic
Když provádíte aritmetické operace s [bigint]
čísly, PowerShell použije převod všech operandů na , což vede ke [bigint]
zkrácení ne celých hodnot. Například [double]
hodnota 1.9
je zkrácena na 1
při převodu na [bigint]
.
PS> [bigint]1 / 1.9
1
PS> 1 / [bigint]1.9
1
Toto chování se liší od chování jiných číselných typů. V tomto příkladu se výsledek [int]
vydělí [double]
výsledkem [double]
. Přetypování 1.9
na [int]
zaokrouhluje hodnotu nahoru na 2
.
PS> 1 / 1.9
0.526315789473684
PS> 1 / [int]1.9
0.5
Přidání a násobení nečíselných typů
Můžete přidat čísla, řetězce, pole a tabulky hash. A můžete násobit čísla, řetězce a pole. Nemůžete ale násobit tabulky hash.
Když přidáte řetězce, pole nebo tabulky hash, prvky se zřetědí. Při zřetězení kolekcí, například polí nebo hash tabulek, se vytvoří nový objekt, který obsahuje objekty z obou kolekcí. Pokud se pokusíte zřetězení tabulek hash se stejným klíčem, operace selže.
Například následující příkazy vytvoří dvě pole a pak je přidají:
$a = 1,2,3
$b = "A","B","C"
$a + $b
1
2
3
A
B
C
Můžete také provádět aritmetické operace s objekty různých typů. Operace, kterou Provádí PowerShell, je určena typem Microsoft .NET objektu úplně vlevo v operaci. PowerShell se pokusí převést všechny objekty v operaci na typ .NET prvního objektu. Pokud je převod objektů úspěšný, provede operaci odpovídající typu .NET prvního objektu. Pokud se nepodaří převést některý z objektů, operace selže.
Následující příklady ukazují použití operátorů sčítání a násobení v operacích, které obsahují různé typy objektů.
$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
Vzhledem k tomu, že metoda, která se používá k vyhodnocení příkazů, je určena objektem úplně vlevo, sčítání a násobení v PowerShellu nejsou výhradně commutativní.
(a + b)
Například se nerovná (b + a)
vždy a (ab)
vždy se nerovná (ba)
.
Následující příklady ukazují tento princip:
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."
Tabulky hash se mírně liší. Do jiné tabulky hash můžete přidat tabulky hash, pokud přidané hashovací tabulky nemají duplicitní klíče.
Následující příklad ukazuje, jak do sebe přidat hashovací tabulky.
$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
Následující příklad vyvolá chybu, protože jeden z klíčů je duplikován v obou tabulkách hash.
$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'
Do pole můžete přidat také tabulku hash; a celá tabulka hash se stane položkou v poli.
$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
Do tabulky hash ale nemůžete přidat žádný jiný typ.
$hash1 + 2
InvalidOperation: A hash table can only be added to another hash table.
I když jsou operátory sčítání velmi užitečné, pomocí operátorů přiřazení přidejte prvky do tabulek hash a polí. Další informace najdete v tématu about_assignment_operators. Následující příklady používají +=
operátor přiřazení k přidání položek do pole:
$array = @()
(0..2).foreach{ $array += $_ }
$array
0
1
2
Aritmetické operátory a proměnné
Můžete také použít aritmetické operátory s proměnnými. Operátory fungují na hodnotách proměnných. Následující příklady ukazují použití aritmetických operátorů s proměnnými:
PS> $intA = 6
PS> $intB = 4
PS> $intA + $intB
10
PS> $a = "Power"
PS> $b = "Shell"
PS> $a + $b
PowerShell
Aritmetické operátory a příkazy
Obvykle používáte aritmetické operátory ve výrazech s čísly, řetězci a poli. Můžete však také použít aritmetické operátory s objekty, které příkazy vrací a s vlastnostmi těchto objektů.
Následující příklady ukazují, jak používat aritmetické operátory ve výrazech s příkazy PowerShellu:
(Get-Date) + (New-TimeSpan -day 1)
Operátor závorek vynutí vyhodnocení Get-Date
rutiny a vyhodnocení výrazu New-TimeSpan -Day 1
rutiny v daném pořadí. Oba výsledky se pak přidají pomocí operátoru +
.
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
Ve výše uvedeném výrazu se každý pracovní prostor procesu ($_.ws
) vynásobí 2
a výsledek ve srovnání 50mb
s tím, jestli je větší.
Bitové operátory
PowerShell podporuje standardní bitové operátory, včetně bitových bitových operátorů AND (-band
), inkluzivních a exkluzivních bitových operátorů OR (-bor
a) -bxor
a bitové ne.-bnot
Počínaje PowerShellem 2.0 pracují všechny bitové operátory s 64bitovými celými čísly.
Počínaje PowerShellem 3.0 -shr
se zavádí (shift-right) a -shl
(shift-left) pro podporu bitových aritmetik v PowerShellu.
PowerShell podporuje následující bitové operátory.
Operátor | Popis | Výraz | Výsledek |
---|---|---|---|
-band |
Bitový operátor AND | 10 -band 3 |
2 |
-bor |
Bitový operátor OR (včetně) | 10 -bor 3 |
11 |
-bxor |
Bitový operátor OR (exkluzivní) | 10 -bxor 3 |
9 |
-bnot |
Bitové NE | -bNot 10 |
-11 |
-shl |
Shift-left | 102 -shl 2 |
408 |
-shr |
Shift-right | 102 -shr 1 |
51 |
Bitové operátory fungují na binárním formátu hodnoty. Například bitová struktura čísla 10 je 00001010 (na základě 1 bajtu) a bitová struktura čísla 3 je 00000011. Když použijete bitové operátory k porovnání 10 až 3, porovná se jednotlivé bity v jednotlivých bajtech.
V bitové operaci AND je výsledný bit nastaven na 1 pouze v případě, že oba vstupní bity jsou 1.
1010 (10)
0011 ( 3)
-------------- bAND
0010 ( 2)
V bitové operaci OR (včetně) je výsledný bit nastaven na 1, pokud je jeden nebo oba vstupní bity 1. Výsledný bit je nastaven na hodnotu 0 pouze v případech, kdy jsou oba vstupní bity nastaveny na 0.
1010 (10)
0011 ( 3)
-------------- bOR (inclusive)
1011 (11)
V bitové operaci OR (exkluzivní) se výsledný bit nastaví na 1, pouze pokud je 1 vstupní bit.
1010 (10)
0011 ( 3)
-------------- bXOR (exclusive)
1001 ( 9)
Bitový operátor NOT je unární operátor, který vytváří binární doplněk hodnoty. Hodnota 1 je nastavená na 0 a hodnota 0 je nastavená na hodnotu 1.
Například binární doplněk 0 je -1, maximální celé číslo bez znaménka (0xFFFFFFFF) a binární doplněk -1 je 0.
-bNot 10
-11
0000 0000 0000 1010 (10)
------------------------- bNOT
1111 1111 1111 0101 (-11, 0xFFFFFFF5)
V bitové operaci posunu doleva se všechny bity přesunou na "n" místa doleva, kde "n" je hodnota pravého operandu. Na jedno místo se vloží nula.
Výraz | Výsledek | Binární výsledek |
---|---|---|
21 -shl 0 |
21 | 0001 0101 |
21 -shl 1 |
42 | 0010 1010 |
21 -shl 2 |
84 | 0101 0100 |
V bitové operaci posunu doprava se všechny bity přesunou na "n" místa doprava, kde "n" je určen správným operandem. Operátor shift-right (-shr
) zkopíruje bit znaménka do levého místa při posunování hodnoty se znaménkem. U nepodepsaných hodnot se do pozice nejvíce vlevo vloží nula.
Výraz | Výsledek | Binární | Šestnáctkový |
---|---|---|---|
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 |