共用方式為


關於算術運算子

簡短描述

描述在 PowerShell 中執行算術的運算子。

詳細描述

算術運算子會計算數值。 您可以使用一或多個算術運算符來加、減、乘和除值,以及計算除法運算的餘數 (模數) 。

此外,加法運算符 (+) 和乘法運算元 (*) 也會在字串、陣列和哈希表上運作。 加法運算符會串連輸入。 乘法運算符會傳回輸入的多個複本。 您甚至可以在算術語句中混合物件類型。 用來評估語句的方法取決於表達式中最左邊物件的類型。

從 PowerShell 2.0 開始,所有算術運算子都會在 64 位數位上運作。

從 PowerShell 3.0 開始, -shr (向右移位) 和 -shl (向左移位) 新增,以支援 PowerShell 中的位算術。

PowerShell 支援下列算術運算子:

運算子 描述 範例
+ 加入整數;串連 6 + 2
字串、陣列和哈希表。 "file" + "name"
@(1, "one") + @(2.0, "two")
@{"one" = 1} + @{"two" = 2}
- 將某個值從另一個值減去 6 - 2
- 讓數位成為負數 -6
(Get-Date).AddDays(-1)
* 將數位乘以或複製字串 6 * 2
和陣列指定的數位 @("!") * 4
時間的 。 "!" * 3
/ 兩個值相除。 6 / 2
% 模數 - 傳回 的餘數 7 % 2
除法運算。
-樂隊 位元 AND 5 -band 3
-bnot 位元 NOT -bnot 5
-博爾 位元 OR 5 -bor 0x03
-bxor 位元 XOR 5 -bxor 3
-shl 將位向左移位 102 -shl 2
-Shr 將位向右移位 102 -shr 2

位運算子只能在整數類型上運作。

運算元優先順序

PowerShell 會以下列順序處理算術運算子:

優先順序 運算子 描述
1 () 括弧
2 - 如果是負數或一元運算符
3 *, /, % 針對乘法和除法
4 +, - 用於加法和減法
5 -band, -bnot 針對位運算
5 -bor, -bxor 針對位運算
5 -shr, -shl 針對位運算

PowerShell 會根據優先順序規則,從左至右處理表達式。 下列範例顯示優先順序規則的效果:

運算式 結果
3+6/3*4 11
3+6/(3*4) 3.5
(3+6)/3*4 12

PowerShell 評估表達式的順序可能會與您所使用的其他程式設計和腳本語言不同。 下列範例顯示複雜的指派語句。

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

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

在此範例中,表達式 $a++ 會在 之前 $b[$a]進行評估。 評估會$a++變更 在語句$c[$a++]中使用 之後的值$a;但在 中使用 $b[$a]之前。 中的變數$a等於 1,而非 0;因此,語句會將值指派給 $b[1],而不是 $b[0]$b[$a]

上述程式代碼相當於:

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

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

除法和捨入

當除法運算的商數是整數時,PowerShell 會將值四捨五入為最接近的整數。 當值為 .5時,它會四捨五入為最接近的偶數整數。

下列範例顯示四捨五入為最接近偶數整數的效果。

運算式 結果
[int]( 5 / 2 ) 2
[int]( 7 / 2 ) 4

請注意 5/2 = 2.5 如何四捨五入為 2。 但是, 7/2 = 3.5 會四捨五入為 4

您可以使用 類別 [Math] 來取得不同的進位行為。

運算式 結果
[int][Math]::Round(5 / 2,[MidpointRounding]::AwayFromZero) 3
[int][Math]::Ceiling(5 / 2) 3
[int][Math]::Floor(5 / 2) 2

如需詳細資訊,請參閱 Math.Round 方法。

加入和乘以非數值類型

您可以加入數位、字串、陣列和哈希表。 而且,您可以將數位、字串和數位相乘。 不過,您無法將哈希表相乘。

當您加入字串、陣列或哈希表時,元素會串連。 當您串連集合,例如數位或哈希表時,會建立新的物件,其中包含這兩個集合中的物件。 如果您嘗試串連具有相同索引鍵的哈希表,作業就會失敗。

例如,下列命令會建立兩個陣列,然後加以新增:

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

您也可以對不同類型的物件執行算術運算。 PowerShell 執行的作業是由作業中最左邊物件的 Microsoft .NET Framework 類型所決定。 PowerShell 會嘗試將作業中的所有物件轉換成第一個物件的 .NET Framework 類型。 如果它成功轉換物件,它會執行適用於第一個物件之 .NET Framework 類型的作業。 如果無法轉換任何物件,作業就會失敗。

下列範例示範使用加法和乘法運算符;包含不同物件類型的作業。 假設 $array = 1,2,3

運算式 結果
"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

因為用來評估語句的方法是由最左邊的物件決定,所以 PowerShell 中的加法和乘法並非嚴格地交換。 例如, (a + b) 不一定等於 (b + a),而且 (ab) 不一定等於 (ba)

下列範例示範此原則:

運算式 結果
"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 + “file”'

哈希表是稍微不同的案例。 只要新增的哈希表沒有重複的索引鍵,您就可以將哈希表新增至另一個哈希表。

下列範例示範如何彼此新增哈希表。

$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

下列範例會擲回錯誤,因為兩個哈希表中都有其中一個索引鍵重複。

$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

此外,您可以將哈希表新增至陣列;和,整個哈希表會變成陣列中的專案。

$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

不過,您無法將任何其他類型新增至哈希表。

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

雖然加法運算子非常有用,但使用指派運算符將元素加入哈希表和數位。 如需詳細資訊,請參閱 about_assignment_operators。 下列範例會 += 使用指派運算符將專案新增至數位:

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

類型轉換以容納結果

PowerShell 會自動選取最能表示結果的 .NET Framework 數值類型,而不會遺失有效位數。 例如:

2 + 3.1

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

如果作業的結果對類型而言太大,結果的類型會擴大以容納結果,如下列範例所示:

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

結果的類型不一定與其中一個操作數相同。 在下列範例中,負值無法轉換成不帶正負號的整數,且不帶正負號的整數太大而無法轉換成 Int32

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

在此範例中, Int64 可以容納這兩種類型。

System.Decimal 類型為例外狀況。 如果任一操作數具有十進位類型,則結果會是 Decimal 類型。 如果結果對十進位類型而言太大,它將不會轉換成 Double。 相反地,會產生錯誤。

運算式 結果
[Decimal]::maxvalue 79228162514264337593543950335
[Decimal]::maxvalue + 1 Value was either too large or too small for a
Decimal.

算術運算子和變數

您也可以搭配變數使用算術運算元。 運算子會處理變數的值。 下列範例示範搭配變數使用算術運算子:

運算式 結果
$intA = 6
$intB = 4
$intA + $intB
10
$a = "Power"
$b = "Shell"
$a + $b
PowerShell

算術運算子和命令

一般而言,您會在表達式中使用算術運算元搭配數位、字串和陣列。 不過,您也可以使用算術運算元搭配命令傳回的物件,以及這些對象的屬性。

下列範例示範如何在表達式中使用算術運算符搭配 PowerShell 命令:

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

括號運算子會 get-date 依該順序強制評估 Cmdlet 和 Cmdlet 表達式的評估 new-timespan -day 1 。 接著會使用運算符來 + 新增這兩個結果。

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

在上述表達式中,每個進程工作區 ($_.ws) 乘 2以 ;而且,結果會與 50mb 比較,以查看其是否大於。

位元運算子

PowerShell 支援標準位運算元,包括位 AND () -bAnd 、包含和獨佔位 OR 運算子 (-bOr-bXor) ,以及位-NOT (-bNot) 。

從 PowerShell 2.0 開始,所有位運算子都使用 64 位整數。

從 PowerShell 3.0 開始, -shr (右移) 和 -shl (向左移) 引進支援 PowerShell 中的位算術。

PowerShell 支援下列位運算符。

運算子 描述 運算式 結果
-band 位元 AND 10 -band 3 2
-bor 位 OR (包含) 10 -bor 3 11
-bxor 位 OR (獨佔) 10 -bxor 3 9
-bnot 位元 NOT -bNot 10 -11
-shl Shift-left 102 -shl 2 408
-shr Shift-right 102 -shr 1 51

位運算子會處理值的二進位格式。 例如,數位10的位結構會根據1位元組) 00001010 (,而數位3的位結構則會00000011。 當您使用位運算符比較 10 到 3 時,會比較每個位元組中的個別位。

在位 AND 運算中,只有在兩個輸入位都是 1 時,產生的位才會設定為 1。

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

在位 OR (內含) 作業中,當或兩個輸入位都是 1 時,產生的位會設定為 1。 只有在兩個輸入位都設定為 0 時,產生的位才會設定為 0。

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

在位 OR (獨佔) 作業中,只有在一個輸入位為 1 時,產生的位才會設定為 1。

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

位 NOT 運算子是產生值的二進位補碼的一元運算元。 1 位設定為 0,而 0 位則設定為 1。

例如,0 的二進位補碼為 -1、最大無符號整數 (0xffffffff) ,而 -1 的二進制補碼為 0。

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

在位移左運算中,所有位都會移至左側的 「n」 位置,其中 「n」 是右操作數的值。 零會插入其中一個位置。

當左操作數是整數 (32 位) 值時,右操作數的較低 5 位會決定左操作數的位移位數。

當左操作數是 Long (64 位) 值時,右操作數的下層 6 位會決定左操作數的位移位數。

運算式 結果 二進位結果
21 -shl 0 21 0001 0101
21 -shl 1 42 0010 1010
21 -shl 2 84 0101 0100

在位移右運算中,所有位都會移至右邊的 「n」 位置,其中 「n」 是由右操作數指定。 shift-right 運算符 (-shr) 將正值或未帶正負號的值移轉至右邊時,在最左邊的位置插入零。

當左操作數是整數 (32 位) 值時,右操作數的較低 5 位會決定左操作數的位移位數。

當左操作數是 Long (64 位) 值時,右操作數的下層 6 位會決定左操作數的位移位數。

運算式 結果 二進位 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

另請參閱