about_Arithmetic_Operators
Kısa açıklama
PowerShell'de aritmetik gerçekleştiren işleçleri açıklar.
Uzun açıklama
Aritmetik işleçler sayısal değerleri hesaplar. Değerleri eklemek, çıkarmak, çarpmak ve bölme işleminin kalan kısmını (modül) hesaplamak için bir veya daha fazla aritmetik işleç kullanabilirsiniz.
Ekleme işleci (+
) ve çarpma işleci (*
) dizeler, diziler ve karma tablolarda da çalışır. Toplama işleci girişi birleştirir.
Çarpma işleci girişin birden çok kopyasını döndürür. Bir aritmetik deyimde nesne türlerini bile karıştırabilirsiniz. deyimini değerlendirmek için kullanılan yöntem, ifadedeki en soldaki nesnenin türüne göre belirlenir.
PowerShell 2.0'da başlayarak, tüm aritmetik işleçler 64 bit sayılar üzerinde çalışır.
PowerShell 3.0'dan başlayarak, -shr
PowerShell'de bit düzeyinde aritmetiği desteklemek için (shift-right) ve -shl
(shift-left) eklenir. Bit düzeyinde işleçler yalnızca tamsayı türlerinde çalışır.
PowerShell aşağıdaki aritmetik işleçleri destekler:
Toplama (
+
) - Sayı ekler, dizeleri, dizileri ve karma tabloları birleştirir6 + 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}
Çıkarma (
-
) - Sayıları çıkarır veya çıkarır6 - 2 # result = 4 - -6 # result = 6 (Get-Date).AddDays(-1) # Yesterday's date
Çarpma (
*
) - Sayıları çarpma veya dizeleri ve dizileri belirtilen sayıda kopyalama6 * 2 # result = 12 @("!") * 4 # result = @("!","!","!","!") "!" * 3 # result = "!!!"
Bölme (
/
) - Sayıları böler6 / 2 # result = 3
Modulus (
%
) - bölme işleminin geri kalanını döndürür.7 % 2 # result = 1
Bit Düzeyinde AND (
-band
)5 -band 3 # result = 1
Bit Düzeyinde DEĞİl (
-bnot
)-bnot 5 # result = -6
Bit Düzeyinde OR (
-bor
)5 -bor 0x03 # result = 7
Bit Düzeyinde XOR (
-bxor
)5 -bxor 3 # result = 6
Bitleri sola kaydırıyor (
-shl
)102 -shl 2 # result = 408
Bitleri sağa kaydırıyor (
-shr
)102 -shr 2 # result = 25
İşleç önceliği
PowerShell aritmetik işleçleri aşağıdaki sırayla işler:
Öncelik | Operator | Açıklama |
---|---|---|
1 | () |
Parantez |
2 | - |
Negatif bir sayı veya birli işleç için |
3 | * , / , % |
Çarpma ve bölme için |
4 | + , - |
Toplama ve çıkarma için |
5 | -band , -bnot |
Bit düzeyinde işlemler için |
5 | -bor , -bxor |
Bit düzeyinde işlemler için |
5 | -shr , -shl |
Bit düzeyinde işlemler için |
PowerShell, ifadeleri soldan sağa öncelik kurallarına göre işler. Aşağıdaki örneklerde öncelik kurallarının etkisi gösterilmektedir:
3+6/3*4 # result = 11
3+6/(3*4) # result = 3.5
(3+6)/3*4 # result = 12
PowerShell'in ifadeleri değerlendirme sırası, kullandığınız diğer programlama ve betik dillerinden farklı olabilir. Aşağıdaki örnekte karmaşık bir atama deyimi gösterilmektedir.
$a = 0
$b = @(1,2)
$c = @(-1,-2)
$b[$a] = $c[$a++]
Bu örnekte, ifade $a++
öncesinde $b[$a]
değerlendirilir. $a++
Değerlendirme, deyiminde $c[$a++]
kullanıldıktan sonra ancak içinde $b[$a]
kullanılmadan önce değerini $a
değiştirir. içindeki $b[$a]
1
değişkeni $a
eşittir, değil0
. Bu nedenle, deyimi yerine öğesine $b[1]
$b[0]
bir değer atar.
Yukarıdaki kod aşağıdakilerle eşdeğerdir:
$a = 0
$b = @(1,2)
$c = @(-1,-2)
$tmp = $c[$a]
$a = $a + 1
$b[$a] = $tmp
Bölme ve yuvarlama
Bölme işleminin bölümü bir tamsayı olduğunda, PowerShell değeri en yakın tamsayıya yuvarlar. değeri olduğunda .5
, en yakın çift tamsayıya yuvarlar.
Aşağıdaki örnek, en yakın çift tamsayıya yuvarlamanın etkisini gösterir.
PS> [int]( 5 / 2 ) # Result is rounded down
2
PS> [int]( 7 / 2 ) # Result is rounded up
4
Sınıfını [Math]
kullanarak farklı yuvarlama davranışı elde edebilirsiniz.
PS> [int][Math]::Round(5 / 2,[MidpointRounding]::AwayFromZero)
3
PS> [int][Math]::Ceiling(5 / 2)
3
PS> [int][Math]::Floor(5 / 2)
2
Daha fazla bilgi için math.round yöntemine bakın.
Sonucu karşılamak için tür dönüştürme
PowerShell, duyarlığı kaybetmeden sonucu en iyi ifade eden .NET sayısal türünü otomatik olarak seçer. Örneğin:
2 + 3.1
(2).GetType().FullName
(2 + 3.1).GetType().FullName
5.1
System.Int32
System.Double
Bir işlemin sonucu tür için çok büyükse, aşağıdaki örnekte olduğu gibi sonucun türü sonucu barındıracak şekilde genişletilir:
(512MB).GetType().FullName
(512MB * 512MB).GetType().FullName
System.Int32
System.Double
Sonucun türü her zaman işlenenlerden biriyle aynı değildir. Aşağıdaki örnekte, negatif değer işaretsiz bir tamsayıya dönüştürülemez ve işaretsiz tamsayı için atanamayacak Int32
kadar büyük:
([int32]::minvalue + [uint32]::maxvalue).gettype().fullname
System.Int64
Bu örnekte, Int64
her iki türü de barındırabilir.
Türü System.Decimal
bir özel durumdur. İki işlenenden biri Ondalık türüne sahipse, sonuç Ondalık türü olur. Ondalık değeri için fazla büyük olan herhangi bir sonuç hatadır.
PS> [Decimal]::maxvalue
79228162514264337593543950335
PS> [Decimal]::maxvalue + 1
RuntimeException: Value was either too large or too small for a Decimal.
Olası duyarlık kaybı
Tür aralığını aşan bir sonuç elde ettiğiniz her durumda, tür dönüştürme nedeniyle duyarlık kaybetme riskiyle karşı karşıyasınız. Örneğin, yeterince büyük [long]
bir eklendiğinde işlenenlerin [int]
dönüştürülmesiyle [double]
sonuçlanır. Bu örnekte, 9223372036854775807
bir [long]
tamsayının en büyük değeridir.
değere ekleme, aralığının taşmasına neden olacak [long]
.
PS> (9223372036854775807 + 2).GetType().FullName
System.Double
sonucun türetilmesi [ulong]
, işlenenler önceye zorlamalı olduğundan yanlış bir sonuç verir [double]
.
PS> [ulong](9223372036854775807 + 2)
9223372036854775808
Büyük değerin ilk olarak tanımlanması [ulong]
, sorundan kaçınarak doğru sonucu verir.
PS> 9223372036854775807ul + 2
9223372036854775809
Ancak, bir [double]
içindeki sonuç aralığını [ulong]
aşmak.
PS> ([ulong]::MaxValue + 1).GetType().FullName
System.Double
Bigint aritmetik
Sayılar üzerinde [bigint]
aritmetik işlemler gerçekleştirdiğinizde PowerShell, tüm işlenenleri [bigint]
değerine dönüştürür ve bu da tamsayı olmayan değerlerin kesilmesine neden olur. Örneğin, [double]
değerine dönüştürüldüğünde [bigint]
değeri 1.9
olarak kesilir1
.
PS> [bigint]1 / 1.9
1
PS> 1 / [bigint]1.9
1
Bu davranış, diğer sayısal türlerin davranışından farklıdır. Bu örnekte, bir ile bölünmüş [double]
bir [int]
sonuç olarak elde edilir[double]
. Bir değerine atama1.9
, değeri değerine yuvarlar2
.[int]
PS> 1 / 1.9
0.526315789473684
PS> 1 / [int]1.9
0.5
Sayısal olmayan türleri ekleme ve çarpma
Sayı, dize, dizi ve karma tablo ekleyebilirsiniz. Ayrıca sayıları, dizeleri ve dizileri çarpabilirsiniz. Ancak karma tabloları çarpamazsınız.
Dizeler, diziler veya karma tablolar eklediğinizde, öğeler birleştirilir. Diziler veya karma tablolar gibi koleksiyonları birleştirirken, her iki koleksiyondaki nesneleri içeren yeni bir nesne oluşturulur. Aynı anahtara sahip karma tabloları birleştirmeye çalışırsanız işlem başarısız olur.
Örneğin, aşağıdaki komutlar iki dizi oluşturur ve bunları ekler:
$a = 1,2,3
$b = "A","B","C"
$a + $b
1
2
3
A
B
C
Ayrıca, farklı türlerdeki nesneler üzerinde aritmetik işlemler de gerçekleştirebilirsiniz. PowerShell'in gerçekleştirdiği işlem, işlemdeki en soldaki nesnenin Microsoft .NET türü tarafından belirlenir. PowerShell, işlemdeki tüm nesneleri ilk nesnenin .NET türüne dönüştürmeye çalışır. Nesneleri dönüştürmede başarılı olursa, ilk nesnenin .NET türüne uygun işlemi gerçekleştirir. Nesnelerden herhangi birini dönüştüremezse işlem başarısız olur.
Aşağıdaki örneklerde, farklı nesne türleri içeren işlemlerde toplama ve çarpma işleçlerinin kullanımı gösterilmektedir.
$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
Deyimleri değerlendirmek için kullanılan yöntem en soldaki nesne tarafından belirlendiğinden, PowerShell'de toplama ve çarpma tam olarak değişmez. Örneğin, (a + b)
her zaman eşit (b + a)
değildir ve (ab)
her zaman eşit (ba)
değildir.
Aşağıdaki örneklerde bu ilke gösterilmektedir:
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."
Karma tablolar biraz farklıdır. Eklenen karma tablolarda yinelenen anahtarlar olmadığı sürece başka bir karma tabloya karma tablolar ekleyebilirsiniz.
Aşağıdaki örnekte karma tabloların birbirine nasıl ekleneceği gösterilmektedir.
$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
Anahtarlardan biri her iki karma tabloda da çoğaltıldığı için aşağıdaki örnek bir hata oluşturur.
$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'
Ayrıca, bir diziye karma tablo ekleyebilirsiniz; ve karma tablosunun tamamı dizideki bir öğeye dönüşür.
$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
Ancak, karma tabloya başka bir tür ekleyemezsiniz.
$hash1 + 2
InvalidOperation: A hash table can only be added to another hash table.
Ekleme işleçleri çok yararlı olsa da, karma tablolara ve dizilere öğe eklemek için atama işleçlerini kullanın. Daha fazla bilgi için bkz. about_assignment_operators. Aşağıdaki örneklerde, diziye öğe eklemek için atama işleci kullanılır +=
:
$array = @()
(0..2).foreach{ $array += $_ }
$array
0
1
2
Aritmetik işleçler ve değişkenler
Değişkenlerle aritmetik işleçler de kullanabilirsiniz. İşleçler değişkenlerin değerlerine göre hareket eder. Aşağıdaki örneklerde değişkenlerle aritmetik işleçlerin kullanımı gösterilmektedir:
PS> $intA = 6
PS> $intB = 4
PS> $intA + $intB
10
PS> $a = "Power"
PS> $b = "Shell"
PS> $a + $b
PowerShell
Aritmetik işleçler ve komutlar
Genellikle sayı, dize ve dizi içeren ifadelerde aritmetik işleçleri kullanırsınız. Ancak, komutların döndüreceği nesnelerle ve bu nesnelerin özellikleriyle aritmetik işleçler de kullanabilirsiniz.
Aşağıdaki örneklerde, PowerShell komutları ile ifadelerde aritmetik işleçlerin nasıl kullanılacağı gösterilmektedir:
(Get-Date) + (New-TimeSpan -day 1)
Parantez işleci, cmdlet'in değerlendirilmesini Get-Date
ve cmdlet ifadesinin değerlendirilmesini New-TimeSpan -Day 1
bu sırada zorlar. Ardından her iki sonuç da işleci kullanılarak +
eklenir.
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
Yukarıdaki ifadede, her işlem çalışma alanı ($_.ws
) ile 2
çarpılır ve sonuç, bundan büyük olup olmadığını görmek için karşılaştırılır 50mb
.
Bit düzeyinde işleçler
PowerShell, bit düzeyinde AND (-band
), dahil ve özel bit tabanlı OR işleçleri (-bor
ve ) ve -bxor
bit düzeyinde DEĞİl (-bnot
) dahil olmak üzere standart bit düzeyinde işleçleri destekler.
PowerShell 2.0'da başlayarak, tüm bit düzeyinde işleçler 64 bit tamsayılarla çalışır.
PowerShell 3.0'dan başlayarak , -shr
(shift-right) ve -shl
(shift-left) PowerShell'de bit tabanlı aritmetiği desteklemek için kullanıma sunulmuştur.
PowerShell aşağıdaki bit düzeyinde işleçleri destekler.
Operator | Açıklama | Expression | Result |
---|---|---|---|
-band |
Bit düzeyinde AND | 10 -band 3 |
2 |
-bor |
Bit Düzeyinde OR (dahil) | 10 -bor 3 |
11 |
-bxor |
Bit Düzeyinde OR (özel) | 10 -bxor 3 |
9 |
-bnot |
Bit Düzeyinde DEĞİl | -bNot 10 |
-11 |
-shl |
Shift-left | 102 -shl 2 |
408 |
-shr |
Sağa kaydırma | 102 -shr 1 |
51 |
Bit düzeyinde işleçler bir değerin ikili biçimine göre hareket eder. Örneğin, 10 sayısının bit yapısı 00001010 (1 bayt temelinde) ve 3 sayısının bit yapısı 00000011. Bit düzeyinde işleç kullanarak 10 ile 3 karşılaştırması yaptığınızda, her bayttaki tek tek bitler karşılaştırılır.
Bit düzeyinde AND işleminde, sonuçta elde edilen bit yalnızca her iki giriş biti de 1 olduğunda 1 olarak ayarlanır.
1010 (10)
0011 ( 3)
-------------- bAND
0010 ( 2)
Bit düzeyinde VEYA (dahil) bir işlemde, sonuçta elde edilen bit 1 olarak ayarlanır ve giriş bitlerinden biri veya her ikisi de 1 olur. Sonuçta elde edilen bit yalnızca her iki giriş biti de 0 olarak ayarlandığında 0 olarak ayarlanır.
1010 (10)
0011 ( 3)
-------------- bOR (inclusive)
1011 (11)
Bit düzeyinde VEYA (özel) bir işlemde, sonuçta elde edilen bit yalnızca bir giriş biti 1 olduğunda 1 olarak ayarlanır.
1010 (10)
0011 ( 3)
-------------- bXOR (exclusive)
1001 ( 9)
Bit düzeyinde NOT işleci, değerin ikili tamamlayıcısını üreten birli işleçtir. 1 biti 0, 0 biti ise 1 olarak ayarlanır.
Örneğin, 0 ikili tamamlayıcısı -1, en fazla işaretsiz tamsayı (0xFFFFFFFF) ve -1 ikili tamamlayıcısı 0'dır.
-bNot 10
-11
0000 0000 0000 1010 (10)
------------------------- bNOT
1111 1111 1111 0101 (-11, 0xFFFFFFF5)
Bit düzeyinde sola kaydırma işleminde, tüm bitler "n" yerler sola taşınır; burada "n" sağ işlenenin değeridir. Bir yere sıfır eklenir.
Expression | Result | İkili Sonuç |
---|---|---|
21 -shl 0 |
21 | 0001 0101 |
21 -shl 1 |
42 | 0010 1010 |
21 -shl 2 |
84 | 0101 0100 |
Bit düzeyinde sağa kaydırma işleminde, tüm bitler "n" yerler sağa taşınır ve burada "n" doğru işlenen tarafından belirtilir. Sağ shift-right işleci (-shr
), imzalı bir değeri kaydırırken işaret bitini en soldaki yere kopyalar. İmzasız değerler için en soldaki konuma sıfır eklenir.
Expression | Result | İkilik | Onaltılık |
---|---|---|---|
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 |
Ayrıca bkz.
PowerShell
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin