主題
    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 行,第 4 個字元 
	+ 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




目錄