about_arithmetic_operators
主題
about_Arithmetic_Operators
簡短描述
描述在 Windows PowerShell 中執行算術運算的運算子。
完整描述
算術運算子會計算數值。您可以使用一個或多個算術運算子將值相加、相減、相乘和
相除,以及計算除法運算的餘數 (模數)。
另外,加法運算子 (+) 與乘法運算子 (*) 也會對字串、陣列和雜湊表進行運算。加法
運算子會將輸入相串連。乘法運算子則會傳回多份輸入副本。您甚至可以在算術陳述
式中混用物件型別。
用於評估陳述式的方法依運算式中最左邊的物件的型別而定。
Windows PowerShell 支援下列算術運算子:
運算子 描述 範例
-------- ----------- -------
+ 整數相加;字串、陣列和雜湊表相串連。 6+2 "file" + "name"
- 兩個值相減。 6-2 (get-date).date -
- 使數字變成負數。 -6+2
-4
* 整數相乘;按照指定的次數複製字串和陣列。 6*2
"w" * 3
/ 兩個值相除。 6/2
% 傳回除法運算的餘數。 7%2
運算子優先順序
Windows PowerShell 會依照下列順序處理算術運算子:
括號 ()
- (代表負數)
*, /, %
+, - (代表減法)
Windows PowerShell 會根據優先順序規則,由左至右處理運算式。下列範例示範優先
順序規則的效果:
C:\PS> 3+6/3*4
11
C:\PS> 10+4/2
12
C:\PS> (10+4)/2
7
C:\PS> (3+3)/ (1+1)
3
Windows PowerShell 評估運算式的順序可能不同於您所使用的其他程式設計語言和指
令碼語言。下列範例示範複雜的指派運算式。
C:\PS> $a = 0
C:\PS> $b = 1,2
C:\PS> $c = -1,-2
C:\PS> $b[$a] = $c[$a++]
C:\PS> $b
1
-1
在這個範例中,$a++ 運算式會在 $c[$a++] 之前進行評估。評估 $a++ 會變更 $a 的
值。$b[$a] 中的 $a 變數會等於 1,而不是 0,因此陳述式會將值指派給 $b[1],而
不是 $b[0]。
非數字型別的加法和乘法
您可以將數字、字串、陣列和雜湊表相加, 也可以將數字、字串和陣列相乘, 但無
法將雜湊表相乘。
字串、陣列或雜湊表相加時,元素會相串連在一起。兩個集合 (如陣列或雜湊表) 相
串連時,會建立新的物件,其中同時含有這兩個集合物件。如果嘗試串連有相同索引
鍵的雜湊表,則運算會失敗。
例如,下列命令會建立兩個陣列,然後將它們相加:
C:\PS> $a = 1,2,3
C:\PS> $b = "A","B,"C"
C:\PS> $a + $b
1
2
3
A
B
C
您也可以對不同型別的物件執行算術運算。Windows PowerShell 執行的運算依運算中
最左邊的物件的 .NET Framework 型別而定。
Windows PowerShell 會嘗試將所有在運算中的物件轉換成第一個物件的
.NET Framework 型別。如果轉換物件成功,則會對第一個物件的 .NET Framework
型別執行適當的運算。如果無法轉換任何物件,則運算會失敗。
下列範例示範在包含不同物件型別的運算中使用加法運算子和乘法運算子。
C:\PS> "file" + 16
file16
C:\PS> $array = 1,2,3
C:\PS> $array + 16
1
2
3
16
C:\PS> $array + "file"
1
2
3
file
C:\PS> "file" * 3
filefilefile
由於用於評估陳述式的方法依最左邊的物件而定,Windows PowerShell 的加法與乘法
未能嚴格地進行交換。例如,(a + b) 和 (b + a) 不一定相等,(a * b) 和 (b * a)
也不一定相等。
下列範例示範此一原理:
C:\PS> "file" + 2
file2
C:\PS> 2 + "file"
無法將 "file" 值轉換為 "System.Int32" 型別。錯誤: "輸入字串格式不正確。"
位於 行:1 字元:4
+ 2 + <<<< "file"
C:\PS> "file" * 3
filefilefile
C:\PS> 3 * "file"
無法將 "file" 值轉換為 "System.Int32" 型別。錯誤: "輸入字串格式不正確。"
位於 行:1 字元:4
+ 3 * <<<< "file"
雜湊表的情況稍異。您可以將雜湊表相加, 也可以將雜湊表加到陣列, 但無法將其
他型別加到雜湊表。
在下列範例中,會示範如何將雜湊表相加,以及將雜湊表加到其他物件。
C:\PS> $hash1 = @{a=1; b=2; c=3}
C:\PS> $hash2 = @{c1="Server01"; c2="Server02"}
C:\PS> $hash1 + $hash2
名稱 值
---- -----
c2 Server02
a 1
b 2
c1 Server01
c 3
C:\PS> $hash1 + 2
您只能對雜湊表新增另一個雜湊表。
位於 行:1 字元:9
+ $hash1 + <<<< 2
C:\PS> 2 + $hash1
無法將 "System.Collections.Hashtable" 轉換為 "System.Int32"。
位於 行:1 字元:4
+ 2 + <<<< $hash1
下列範例示範您可以將雜湊表加到陣列。整個雜湊表會以單一物件方式加到雜湊表。
C:\PS> $array = 1,2,3
C:\PS> $array + $hash1
1
2
3
名稱 值
---- -----
a 1
b 2
c 3
C:\PS> $sum = $array + $hash1
C:\PS> $sum.count
4
C:\PS> $sum[3]
名稱 值
---- -----
a 1
b 2
c 3
PS C:\ps-test> $sum + $hash2
1
2
3
名稱 值
---- -----
a 1
b 2
c 3
c2 Server02
下列範例示範您無法將有相同索引鍵的雜湊表相加。
C:\PS> $hash1 = @{a=1; b=2; c=3}
C:\PS> $hash2 = @{c="red"}
C:\PS> $hash1 + $hash2
對 '+' 運算子無效的引數: 已經加入項目。
字典中的索引鍵: 'c' 加入的索引鍵: 'c'
位於 行:1 字元:9
+ $hash1 + <<<< $hash2
雖然加法運算子非常實用,不過請使用指派運算子將元素加到雜湊表和陣列。如需詳細
資訊,請參閱 about_assignment_operators。下列範例會使用 += 指派運算子將項目
加到陣列:
C:\PS> $array
1
2
3
C:\PS> $array + "file"
1
2
3
file
C:\PS> $array
1
2
3
C:\PS> $array += "file"
C:\PS> $array
1
2
3
file
C:\PS> $hash1
名稱 值
---- -----
a 1
b 2
c 3
C:\PS> $hash1 += @{e = 5}
C:\PS> $hash1
名稱 值
---- -----
a 1
b 2
e 5
c 3
Windows PowerShell 會自動選取 .NET Framework 數字型別,這種型別能最有效地
表示結果,卻不會損失精確度。例如:
C:\PS> 2 + 3.1
5.1
C:\PS> (2). GetType().FullName
System.Int32
C:\PS> (2 + 3.1).GetType().FullName
System.Double
如果運算的結果對這種型別而言太大,則會將結果的型別擴大以容納結果,如下列範
例所示:
C:\PS> (512MB).GetType().FullName
System.Int32
C:\PS> (512MB * 512MB).GetType().FullName
System.Double
結果的型別與其中一個運算元不一定要相同。在下列範例中,負值無法將轉換成不帶
正負號的整數,而不帶正負號的整數太大以致於無法轉換成 Int32:
C:\PS> ([int32]::minvalue + [uint32]::maxvalue).gettype().fullname
System.Int64
在這個範例中,Int64 能夠容納這兩種型別。
System.Decimal 型別是例外狀況。如果任一運算元有 Decimal 型別,結果的型別會
是 Decimal。如果結果對 Decimal 型別而言太大,則不會轉換成 Double, 而是會產
生錯誤。
C:\PS> [Decimal]::maxvalue
79228162514264337593543950335
C:\PS> [Decimal]::maxvalue + 1
數值對 Decimal 而言太大或太小。
位於 行:1 字元:22
+ [Decimal]::maxvalue + <<<< 1
算術運算子和變數
您也可以將算術運算子與變數搭配使用。運算子對變數的值有作用。下列範例示範將算
術運算子與變數搭配使用:
C:\PS> $intA = 6
C:\PS> $intB = 4
C:\PS> $intA + $intB
10
C:\PS> $a = "Windows "
C:\PS> $b = "PowerShell "
C:\PS> $c = 2
C:\PS> $a + $b + $c
Windows PowerShell 2
算術運算子和命令
通常您會在運算式中搭配數字、字串和陣列使用算術運算子。不過,您也可以搭配命
令傳回的物件和這些物件的屬性使用算術運算子。
在下列範例中,會示範如何在運算式中搭配 Windows PowerShell 命令使用算術運算
子:
C:\PS> get-date
2008 年 1 月 2 日 下午 1:28:42
C:\PS> $day = new-timespan -day 1
C:\PS> get-date + $day
2008 年 1 月 3 日 下午 1:34:52
C:\PS> get-process | where {($_.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
範例
在下列範例中,會示範如何在 Windows PowerShell 中使用算術運算子:
C:\PS> 1 + 1
2
C:\PS> 1 - 1
0
C:\PS> -(6 + 3)
-9
C:\PS> 6 * 2
12
C:\PS> 7 / 2
3.5
C:\PS> 7 % 2
1
C:\PS> w * 3
www
C:\PS> 3 * "w"
無法將 "w" 值轉換為 "System.Int32" 型別。錯誤: "輸入字串格式不正確。"
位於 行:1 字元:3
+ 3 * <<<< "w"
PS C:\ps-test> "Windows" + " " + "PowerShell"
Windows PowerShell
PS C:\ps-test> $a = "Windows" + " " + "PowerShell"
PS C:\ps-test> $a
Windows PowerShell
C:\PS> $a[0]
W
C:\PS> $a = "TestFiles.txt"
C:\PS> $b = "C:\Logs\"
C:\PS> $b + $a
C:\Logs\TestFiles.txt
C:\PS> $a = 1,2,3
C:\PS> $a + 4
1
2
3
4
C:\PS> $servers = @{0 = "LocalHost"; 1 = "Server01"; 2 = "Server02"}
C:\PS> $servers + @{3 = "Server03"}
名稱 值
---- -----
3 Server03
2 Server02
1 Server01
0 LocalHost
C:\PS> $servers
名稱 值
---- -----
2 Server02
1 Server01
0 LocalHost
C:\PS> $servers += @{3 = "Server03"} # 使用指派運算子
C:\PS> $servers
名稱 值
---- -----
3 Server03
2 Server02
1 Server01
0 LocalHost
請參閱
about_arrays
about_assignment_operators
about_comparison_operators
about_hash_tables
about_operators
about_variables
Get-Date
New-TimeSpan