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