主題 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