主題
    about_assignment_operators

簡短描述
    描述如何使用運算子將值指派給變數。


完整描述
    指派運算子會將一個或多個值指派給變數, 而且可以在指派之前先對值執行數值運算。


    Windows PowerShell 支援下列指派運算子。


    運算子  描述  
    -------   -----------
    =         將變數值設為指定值。

    +=        將變數值加上指定值,或將指定值附加到現有值。
 
    -=        將變數值減去指定值。
 
    *=        將變數值乘以指定值,或將指定值附加到現有值。
 
    /=        將變數值除以指定值。
 
    %=        將變數值除以指定值後再將餘數 (模數) 指派給變數。

    ++        將變數值、可指派的屬性值或陣列元素值加上 1。

    --        將變數值、可指派的屬性值或陣列元素值減去 1。
 

  語法
    指派運算子的語法如下:


        <可指派的運算式> <指派運算子> <值>


    可指派的運算式包含變數和屬性。值可以是單一值、值陣列、命令、運算式或陳述式。


    遞增運算子和遞減運算子都是一元運算子。各有前置模式及後置模式。


        <可指派的運算式><運算子>
        <運算子><可指派的運算式>


    可指派的運算式必須是數字,或必須可轉換成數字。


  指派值
    變數在記憶體中佔有空間,用來儲存值。您可以使用指派運算子 (=) 將值儲存到變數。
    新值可以取代變數的現有值,或者您可以將新值附加到現有值。


    基本的指派運算子是等號 (=)(ASCII 61)。例如,下列陳述列會將 Windows 
    PowerShell 這個值指派給 $MyShell 變數:


        $MyShell = "Windows PowerShell" 


    在 Windows PowerShell 中將值指派給變數時,如果變數不存在,就會加以建立。例
    如,下列第一個指派陳述式會建立 $a 變數,然後將值 6 指派給 $a。第二個指派陳述式
    會將值 12 指派給 $a。第一個陳述式會建立新變數, 而第二個陳述式只會變更其值:


        $a = 6
        $a = 12

 
    Windows PowerShell 中的變數並沒有特定的資料型別,除非您對變數進行轉換。變數
    只包含一個物件時,它會接受該物件的資料型別。而變數包含物件的集合時,它的資料型
    別會是 System.Object。因此,您可以將物件的型別指派給集合。下列範例示範您可
    以將處理序物件、服務物件、字串和整數加到變數,而不會產生錯誤: 


        $a = get-process
        $a += get-service
        $a += "string"
        $a += 12
 

    由於指派運算子 (=) 的優先順序比管線運算子 (|) 要低,將命令管線指派給變數並不需
    要使用括號。例如,下列命令會將電腦上的服務排序,然後將排序過的服務指派給 $a 變
    數:


        $a = get-service | sort name


    您也可以將陳述式所建立的值指派給變數,如下列範例所示: 


        $a = if ($b -lt 0) { 0 } else { $b }


    這個範例會在 $b 值小於 0 時將 0 指派給 $a 變數,而在 $b 值不小於 0 時將 $b 值
    指派給 $a。

 

  指派運算子 (=)
    指派運算子 (=) 會將值指派給變數。如果變數原本就有值,指派運算子 (=) 將直接取
    代該值而不予以警告。


    下列陳述列會將整數值 6 指派給 $a 變數。


        $a = 6 

    若要將字串值指派給變數,請將字串值放在引號內,如下所示:


        $a = "baseball" 


    若要將陣列 (多個值) 指派給變數,請用逗號分隔各值,如下所示:


        $a = "apple", "orange", "lemon", "grape" 

    若要將雜湊表指派給變數,請在 Windows PowerShell 中使用標準雜湊表標記法, 也
    就是輸入 @ 符號,後面接著以分號 (;) 分隔且放在大括號 ({ }) 內的索引鍵/值組。
    例如,若要將雜湊表指派給 $a 變數,請輸入:


        $a = @{one=1; two=2; three=3} 


    若要將十六進位值指派給變數,請在值前面加上 "0x"。Windows PowerShell 會將十
    六進位值 (0x10) 轉換成十進位值 (就本例而言即 16),然後將轉換後的值指派給 $a 
    變數。例如,若要將值 0x10 指派給 $a 變數,請輸入:


        $a = 0x10 


    若要將指數值指派給變數,請輸入底數、字母 "e" 和代表 10 的倍數的數字。例如,若要
    將 3.1415 的 1,000 次方的值指派給 $a 變數,請輸入:


        $a = 3.1415e3 


    Windows PowerShell 也能將千位元組 (KB)、百萬位元組 (MB) 和十億位元組 (GB) 轉
    換成位元組。例如,若要將 10 KB 的值指派給 $a 變數,請輸入:


        $a = 10kb


  加法指派運算子 (+=)
    加法指派運算子 (+=) 會遞增變數值,或將指定值附加到現有值, 而執行的動作取決於變
    數的型別是數字還是字串,以及變數包含的是單一值 (純量) 還是多個值 (集合)。


    += 運算子是合併兩種運算, 它會先做加法運算,再做指派運算。因此,下列兩個陳述式
     皆相等:


        $a += 2
        $a = ($a + 2)

 
    當變數包含單一數值時,+= 運算子會將現有值遞增運算子右邊的數量, 然後將結果值指
    派給變數。
    在下列範例中,會示範如何使用 += 運算子增加變數值:


        C:\PS> $a = 4
        C:\PS> $a += 2
        C:\PS> $a
        6
 

    當變數值是字串時,+= 運算子會將運算子右邊的值附加到字串,如下所示: 


        C:\PS> $a = "Windows"
        C:\PS> $a +- " PowerShell"
        C:\PS> $a
        Windows PowerShell 


    當變數值是陣列時,+= 運算子會將運算子右邊的值附加到陣列,如下所示: 除非陣列經
    由轉型而有明確的型別,否則您可以將任何型別的值附加到陣列,如下所示:


        C:\PS> $a = 1,2,3
        C:\PS> $a += 2
        C:\PS> $a
        1
        2
        3
        2
        C:\PS> $a += "String"
        C:\PS> $a
        1
        2
        3
        2
        String

 
    當變數值是雜湊表時,+= 運算子會將運算子右邊的值附加到雜湊表。但是因為唯一可以
    加到雜湊表的型別是另一個雜湊表,因此所有其他指派都會失敗。


    例如,下列命令會將雜湊表指派給 $a 變數。
    然後使用 += 運算子將另一個雜湊表附加到現有雜湊表,以便有效地將新的索引鍵/值組加
    到現有雜湊表。這個命令會執行成功,如下列輸出所示:


        C:\PS> $a = @{a = 1; b = 2; c = 3}
        C:\PS> $a += @{mode = "write"}
        C:\PS> $a
        名稱                           值
        ----                           -----
        a                              1
        b                              2
        mode                           write
        c                              3


    下列命令會嘗試將整數 (1) 指派給 $a 變數中的雜湊表, 但是會執行失敗:


        C:\PS> $a = @{a = 1; b = 2; c = 3}
        C:\PS> $a += 1
        您只能對雜湊表新增另一個雜湊表。
        位於第 1 行,第 6 個字元
        + $a += <<<< 1


  減法指派運算子 (-=)
    減法指派運算子 (-=) 會將變數值遞減運算子右邊所指定的值。
    此運算子不能用在字串變數,也無法用來移除集合的元素。


    -= 運算子是合併兩種運算, 它會先做減法運算,再做指派運算。因此,下列兩個陳述式
     皆相等:


        $a -= 2
        $a = ($a - 2)

 
    在下列範例中,會示範如何使用 -= 運算子減少變數值:


        C:\PS> $a = 8
        C:\PS> $a -= 2
        C:\PS> $a
        6

 
    您也可以使用 -= 指派運算子減少數值陣列的成員值。要這樣做,請指定要變更之陣列元
    素的索引。下列命令會將陣列中第三個元素的值 (元素 2) 減少 1:


        C:\PS> $a = 1,2,3
        C:\PS> $a[2] -= 1.
        C:\PS> $a
        1
        2
        2

 
    您無法使用 -= 運算子刪除變數值。若要刪除所有指派給變數的值,請使用 Clear-Item 
    或 Clear-Variable Cmdlets 將值 $null 或 "" 指派給變數。


        $a = $null 


    若要從陣列刪除特定值,請使用陣列標記法將值 $null 指派給特定項目。例如,下列陳
    述式會從陣列刪除第二個值 (索引位置 1):



        C:\PS> $a = 1,2,3
        C:\PS> $a
        1
        2
        3

        C:\PS> $a[1] = $null
        C:\PS> $a
        1
        3
 

    若要刪除變數,請使用 Remove-Variable Cmdlet。當變數已明確轉換成特定資料型
    別,但您想要使用不具型別變數時,很適合使用這個方法。下列命令會刪除 $a 變數:


        remove-variable a
 

  乘法指派運算子 (*=)    乘法指派運算子 (*=) 會乘以數值,或按照指定的份數附加變數
  的字串值。


    當變數包含單一數值時,*= 運算子會將該值會乘以運算子右邊的值。例如,在下列範例
    中,會示範如何使用 *= 運算子對變數值執行乘法運算:


        C:\PS> $a = 3
        C:\PS> $a *= 4
        C:\PS> $a
        12
 

    在本例中,*= 運算子是合併兩種運算, 它會先做乘法運算,再做指派運算。因此,下列
    兩個陳述式皆相等:


        $a *= 2
        $a = ($a * 2)

 
    當變數包含字串值時,Windows PowerShell 會將指定的字串數附加到該值,如下所示:


        C:\PS> $a = "file"
        C:\PS> $a *= 4 
        C:\PS> $a
        filefilefilefile

 
    若要對陣列元素執行乘法運算,請使用索引識別要執行乘法運算的元素。例如,下列命令
    會將陣列中的第一個元素 (索引位置 0) 乘以 2:


        $a[0] *= 2
 

  除法指派運算子 (/=)
    除法指派運算子 (/=) 會將數值除以運算子右邊所指定的值。此運算子不能用在字串變
    數。


    /= 運算子是合併兩種運算, 它會先做除法運算,再做指派運算。因此,下列兩個陳述式
    皆相等:


        $a /= 2
        $a = ($a / 2)

 
    例如,下列命令會使用 /= 運算子對變數值執行除法運算:


        C:\PS> $a = 8
        C:\PS> $a /=2
        C:\PS> $a
        4

 
    若要對陣列元素執行除法運算,請使用索引識別要變更的元素。例如,下列命令會將陣列
    中的第二個元素 (索引位置 1) 除以 2:


        $a[1] /= 2
 

  模數指派運算子 (%=)
    模數指派運算子 (%=) 會將變數值除以運算子右邊的值。%= 運算子然後會將餘數 (即模
    數) 指派給變數。只有當變數包含單一數值時,才能使用此運算子。當變數包含字串或
    陣列時,無法使用此運算子。


    %= 運算子是合併兩種運算, 它會先做除法運算並求得餘數後,再將餘數指派給變數。因
    此,下列兩個陳述式皆相等:


        $a %= 2
        $a = ($a % 2)

 
    在下列範例中,會示範如何使用 %= 運算子儲存商數的模數:


        C:\PS> $a = 7
        C:\PS> $a %= 4
        C:\PS> $a
        3


  遞增運算子和遞減運算子

    遞增運算子 (++) 會將變數值加上 1。在簡單陳述式中使用遞增運算子時,並不會傳回任
    何值。
    若要檢視結果,請顯示變數值,如下所示:


        C:\PS> $a = 7
        C:\PS> ++$a
        C:\PS> $a
        8


    若要強制傳回值,請將變數和運算子都放在括號內,如下所示:


        C:\PS> $a = 7
        C:\PS> (++$a)
        8


    遞增運算子的位置可以在變數之前 (前置) 或在變數之後 (後置)。此運算子的前置模式
    會在變數值用於陳述式之前先遞增變數,如下所示:


        C:\PS> $a = 7
        C:\PS> $c = ++$a
        C:\PS> $a
        8
        C:\PS> $c
        8


    此運算子的後置模式會在變數值用於陳述式之後才遞增變數。在下列範例中,$c 與 $a 變
    數各有不同的值,因為在 $a 變更之前值已被指派給 $c:


        C:\PS> $a = 7
        C:\PS> $c = $a++
        C:\PS> $a
        8
        C:\PS> $c
        7


    遞減運算子 (--) 會將變數值減去 1。與遞增運算子一樣,在簡單陳述式中使用遞減運算
    子時,並不會傳回任何值。請用括號來傳回值,如下所示:


        C:\PS> $a = 7
        C:\PS> --$a
        C:\PS> $a
        6
        C:\PS> (--$a)
        5


    此運算子的前置模式會在變數值用於陳述式之前先遞減變數,如下所示:


        C:\PS> $a = 7
        C:\PS> $c = --$a
        C:\PS> $a
        6
        C:\PS> $c
        6


    此運算子的後置模式會在變數值用於陳述式之後才遞減變數。在下列範例中,$d 與 $a 變
    數各有不同的值,因為在 $a 變更之前值已被指派給 $d:


        C:\PS> $a = 7
        C:\PS> $d = $a--
        C:\PS> $a
        6
        C:\PS> $d
        7


  MICROSOFT .NET FRAMEWORK 型別
    根據預設,當變數只有一個值時,指派給變數的值會決定變數的資料型別。例如,下列命
    令會建立一個有整數 (System.Int32) 型別的變數:


        $a = 6 


    若要尋找變數的 .NET Framework 型別,請使用 GetType 方法及其 FullName 屬性,
    如下所示。請務必在 GetType 方法名稱後面加上括號,即使這個方法呼叫沒有任何引數
    也一樣:


        C:\PS> $a = 6 
        C:\PS> $a.gettype().fullname 
        System.Int32 


    若要建立含有字串的變數,請將字串值指派給變數。為了表示值是字串,請將它放在引號
    內,如下所示:


        C:\PS> $a = "6"
        C:\PS> $a.gettype().fullname
        System.String

 
    如果指派給變數的第一個值是字串,Windows PowerShell 會將所有運算都視為字串運
    算,並且將新值轉換成字串, 如下列範例所示:


        C:\PS> $a = "file"
        C:\PS> $a += 3
        C:\PS> $a
        file3

 
    如果第一個值是整數,Windows PowerShell 會將所有運算都視為整數運算,並且將新
    值轉換成整數, 如下列範例所示:


        C:\PS> $a = 6
        C:\PS> $a += "3"
        C:\PS> $a
        9

 
    您可以將型別名稱置於方括號內,然後放在新純量變數名稱或第一個指派值的前面,藉此將
    該變數轉換成任何 .NET Framework 型別。轉換變數時,可以決定能儲存在變數中的資
    料型別, 而且可以決定在使用變數時變數的反應方式。


    例如,下列命令會將變數轉換成字串型別:


        C:\PS> [string]$a = 27
        C:\PS> $a += 3
        C:\PS> $a
        273
 

    下列範例會轉換第一個值,而非轉換變數:


        $a = [string]27

 
    在將變數轉換成特定型別時,一般慣例通常是轉換變數,而非轉換值。不過,如果現有變
    數的值無法轉換成新的資料型別,就無法重新轉換現有變數的資料型別。若要變更資料型
    別,必須取代變數的值,如下所示:


        C:\PS> $a = "string"
        C:\PS> [int]$a
        無法將 "string" 值轉換為 "System.Int32" 型別。錯誤: "輸入字串格式不正
        確。"
        位於第 1 行,第 8 個字元
        + [int]$a <<<<

        C:\PS> [int]$a =3
 

    此外,將資料型別放在變數名稱前面會鎖定變數的型別,除非您藉由指定其他資料型別以明
    確覆寫該型別。如果未明確覆寫型別,以致嘗試指派的值與現有型別不相容,Windows 
    PowerShell 便會顯示錯誤,如下列範例所示:


        C:\PS> $a = 3
        C:\PS> $a = "string"

        C:\PS> [int]$a = 3
        C:\PS> $a = "string"
        無法將 "string" 值轉換為 "System.Int32" 型別。錯誤: "輸入字串格式不正
        確。"
        位於第 1 行,第 3 個字元
        + $a <<<< = "string"

        C:\PS> [string]$a = "string"
 

    Windows PowerShell 在處理陣列中有多個項目之變數的資料型別方面,做法上有別於
    處理有一個項目之變數的資料型別。除非明確為陣列變數指派資料型別,否則其資料型別
    一定是 System.Object []。這是陣列專屬的型別。


    有時可以指定其他型別覆寫預設型別。例如,下列命令會將變數轉換成 string [] 陣列
    型別:



        [string []] $a = "one", "two", "three"
 

    Windows PowerShell 變數可以是任何 .NET Framework 資料型別。此外,您也可
    以指派目前處理序中可用的任何完整的 .NET Framework 資料型別。例如,下列命令會
    指定 System.DateTime 資料型別:


        [system.datetime]$a = "5/31/2005"

 
    而變數會被指派與 System.DateTime 資料型別相符的值。因此,$a 變數的值會是:


        2005 年 5 月 31 日 (星期二) 上午 12:00:00


  指定多重變數
    您可以在 Windows PowerShell 中使用單一命令將值指派給多個變數。指定值的第一
    個元素會指定給第一個變數,第二個元素指定給第二個變數,第三個元素指定給第三個變
    數,依此類推。例如,下列命令會將值 1、2 和 3 分別指派給變數 $a、$b 和 $c。


        C:\PS> $a, $b, $c = 1, 2, 3

 
    如果指派值包含的元素比變數多,多出的值全部會指派給最後一個變數。例如,下列命令
    包含三個變數和五個值:


        $a, $b, $c = 1, 2, 3, 4, 5

 
    因此,Windows PowerShell 會將值 1 和 2 分別指派給變數 $a 和 $b, 而將值 3、
    4 和 5 都指派給變數 $c。若要將 $c 變數中的值指派給另外三個變數,請使用下列格
    式:


        $d, $e, $f = $c


    這個命令會將值 3、4 和 5 分別指派給變數 $d、$e 和 $f。


    您也可以鏈結變數而將單一值指定給多個變數。例如,下列命令將值 "three" 同時指定給
    四個變數:


        $a = $b = $c = $d = "three"

    
  與變數相關的 CMDLET
    除了使用指派運算設定變數值外,您還可以使用 Set-Variable Cmdlet。例如,下列
    命令會使用 Set-Variable 將 1, 2, 3 陣列指派給 $a 變數。


        Set-Variable -name a -value 1, 2, 3 

請參閱
    about_Arrays
    about_Hash_Tables
    about_Variables
    Clear-Variable
    Remove-Variable
    Set-Variable




目錄