簡短描述
描述如何使用運算子將值指派給變數。
完整描述
指派運算子會將一或多個值指派給變數。 等號 (=) 是 PowerShell 指派運算符。 PowerShell 也有下列 複合 指派運算符:+=、-=、*=、%=、++、--、??=。
複合指派運算子會在指派之前對值執行作業。
語法
指派運算符的語法如下所示:
-
<assignable-expression><assignment-operator><value>
可指派的表達式包括變數和屬性。 此值可以是單一值、值陣列或命令、運算式或語句。
遞增和遞減運算符是一元運算符。 每個都有前置版本和後置版本。
<assignable-expression><operator><operator><assignable-expression>
可指派表達式的值必須是數位,或者必須可轉換成數位。
使用賦值運算子
變數是儲存值的具名記憶體空間。 您可以使用指派運算子 =,將值儲存在變數中。 新的值可以取代變數的現有值,也可以將新的值附加至現有的值。 例如,下列語句會將值PowerShell指派給 $MyShell 變數:
$MyShell = "PowerShell"
當您在PowerShell中將值指派給變數時,如果變數不存在,就會建立變數。 例如,下列兩個指派語句中的第一個會建立 $a 變數,並將值 6 指派給 $a。 第二個指派語句會將 12 的值指派給 $a。 第一個語句會建立新的變數。 第二個語句只會變更其值:
$a = 6
$a = 12
除非您轉換變數,否則 PowerShell 中的變數沒有特定的數據類型。 當變數只包含一個物件時,變數會採用該物件的數據類型。 當變數包含 物件的集合時,變數具有 System.Object 數據類型。 因此,您可以將任何類型的物件指派給集合。 下列範例顯示您可以將進程對象、服務物件、字串和整數新增至變數,而不會產生錯誤:
$a = Get-Process
$a += Get-Service
$a += "string"
$a += 12
由於指派運算子 = 的優先順序低於管線運算符 |,因此不需要括號將命令管線的結果指派給變數。 例如,下列命令會排序電腦上的服務,然後將已排序的服務指派給 $a 變數:
$a = Get-Service | Sort-Object -Property Name
您也可以將 語句所建立的值指派給變數,如下列範例所示:
$a = if ($b -lt 0) { 0 } else { $b }
如果 $a 的值小於零,本範例會將零指派給 $b 變數。 如果 $b 的值不小於零,則會將 $a 的值指派給 $b。
若要將陣列 (多個值) 指派給變數,請使用逗號分隔值,如下所示:
$a = "apple", "orange", "lemon", "grape"
若要將哈希表指派給變數,請在PowerShell中使用標準哈希表表示法。 在輸入 @符號 @ 後,接著鍵值對以分號分隔 ;,再以大括弧括住 { }。 例如,若要將哈希表指派給 $a 變數,請輸入:
$a = @{one=1; two=2; three=3}
若要將十六進位值指派給變數,請在值前面加上 0x。
PowerShell 會將十六進位值 (0x10) 轉換為十進位值(在此案例中為 16),並將該值指派給 $a 變數。 例如,若要將 0x10的值指派給 $a 變數,請輸入:
$a = 0x10
若要將指數值指派給變數,請輸入根編號、字母 e,以及代表 10 倍數的數位。 例如,若要將 3.1415 的 1,000 次方的結果指派給 $a 變數,請輸入:
$a = 3.1415e3
PowerShell 也可以將 kb KB、mb MB和 gb GB 轉換成位元組。 例如,若要將 10 KB 的值指派給 $a 變數,請輸入:
$a = 10kb
使用複合指派運算子
複合指派運算子會在指派之前對值執行數值運算。
重要
複合指派運算子不會使用動態範圍。 變數總是位於目前的範圍內。
在下列範例中,變數 $x 定義於全域範圍中。 大括弧會建立新的範圍。 大括弧內的變數 $x 是新的實例,而不是全域變數的複本。
$x = 1 # Global scope
& { $x += 1; $x }
1
當您使用一般指派運算符時,您會從父範圍取得變數的複本。 但請注意,父範圍中的 $x 不會變更。
$x = 1 # Global scope
& { $x = $x + 1; $x }
"Global `$x = $x"
2
Global $x = 1
使用加法運算子的指派
加法運算符指派 += 遞增變數的值,或將指定的值附加至現有的值。 動作取決於變數是否有數值或字串類型,以及變數是否包含單一值(純量)或多個值(集合)。
+= 運算子會結合兩個操作。 首先新增,然後指派。
因此,下列語句是相等的:
$a += 2
$a = ($a + 2)
當變數包含單一數值時,+= 運算符會依運算子右側的數量遞增現有的值。 然後,運算符會將產生的值指派給變數。 下列範例示範如何使用 += 運算符來增加變數的值:
$a = 4
$a += 2
$a
6
當變數的值是字串時,運算元右邊的值會附加至字串,如下所示:
$a = "Windows"
$a += " PowerShell"
$a
Windows PowerShell
當變數的值是陣列時,+= 運算符會將運算子右邊的值附加至陣列。 除非明確地透過轉型指定類型,否則您可以將任何類型的值添加到陣列中,如下所示:
$a = 1,2,3
$a += 2
$a
1
2
3
2
和
$a += "String"
$a
1
2
3
2
String
當變數的值是哈希表時,+= 運算符會將運算元右邊的值附加至哈希表。 不過,因為您可以新增至哈希表的唯一類型是另一個哈希表,所有其他指派都會失敗。
例如,下列命令會將哈希表指派給 $a 變數。
然後,它會使用 += 運算符,將另一個哈希表附加至現有的哈希表,有效地將新的索引鍵/值組新增至現有的哈希表。
此指令會成功,如輸出所示:
$a = @{a = 1; b = 2; c = 3}
$a += @{mode = "write"}
$a
Name Value
---- -----
a 1
b 2
mode write
c 3
下列命令會嘗試將整數 「1」 附加至 $a 變數中的哈希表。 這個指令失敗:
$a = @{a = 1; b = 2; c = 3}
$a += 1
InvalidOperation:
Line |
2 | $a += 1
| ~~~~~~~
| A hash table can only be added to another hash table.
減法運算子指派
指派減法運算子 -= 將變數的值遞減至運算子右邊指定的值。 此運算符無法與字串變數搭配使用,而且無法用來從集合中移除元素。
-= 運算子會結合兩個操作。 首先,它會減去,然後賦值。 因此,下列語句是相等的:
$a -= 2
$a = ($a - 2)
下列範例示範如何使用 -= 運算子來減少變數的值:
$a = 8
$a -= 2
$a
6
您也可以使用 -= 指派運算子來減少數值陣列成員的值。 若要這樣做,請指定您要變更之陣列元素的索引。 在下列範例中,陣列第三個元素的值會減少 1:
$a = 1,2,3
$a[2] -= 1
$a
1
2
2
您無法使用 -= 運算子來刪除變數的值。 若要刪除指派給變數的所有值,請使用 Clear-Item 或 Clear-Variable Cmdlet 將值指派給變數 $null 或 ""。
$a = $null
若要從陣列中刪除特定值,請使用陣列語法將特定元素的值設為 $null。 例如,下列語句會從陣列中刪除第二個值(索引位置 1):
$a = 1,2,3
$a
1
2
3
$a[1] = $null
$a
1
3
若要刪除變數,請使用 Remove-Variable Cmdlet。 當變數明確轉換成特定數據類型,而且您想要不具類型的變數時,這個方法很有用。 下列命令會刪除 $a 變數:
Remove-Variable -Name a
乘法運算子賦值
乘法運算符指派 *= 將數值相乘,或追加變數字串值的指定數量的複本。
當變數包含單一數值時,該值會乘以運算符右邊的值。 例如,下列範例示範如何使用 *= 運算符,將變數的值相乘:
$a = 3
$a *= 4
$a
12
在此情況下,*= 運算符會結合兩個作業。 首先,它進行乘法運算,然後再指派。 因此,下列語句是相等的:
$a *= 2
$a = ($a * 2)
當變數包含字串值時,PowerShell 會將指定的字串數目附加至值,如下所示:
$a = "file"
$a *= 4
$a
filefilefilefile
若要乘陣列的一個元素,請使用索引來識別您想要乘的元素。 例如,下列命令會將陣列中索引位置 0 的第一個元素乘以 2。
$a[0] *= 2
依除法運算符指派
透過除法運算子 /= 的指派,將數字除以運算子右側指定的值。 運算子不能與字串變數搭配使用。
/= 運算子會結合兩個操作。 首先,它會分割,然後指派。 因此,下列兩個語句相等:
$a /= 2
$a = ($a / 2)
例如,下列命令會使用 /= 運算子來分割變數的值:
$a = 8
$a /=2
$a
4
若要變更陣列的元素,請使用索引來識別您想要變更的元素。 例如,下列命令會將陣列中的第二個元素(索引位置 1) 除以 2:
$a[1] /= 2
透過模數運算子的指派
模數運算子指派 %= 將變數的值除以運算元右邊的值。 然後,%= 運算符會將餘數(稱為模數)指派給變數。 只有當變數包含單一數值時,才可以使用此運算符。 當變數包含字串變數或數位時,您無法使用此運算元。
%= 運算子會結合兩個操作。 首先,它會分割並決定餘數,然後將餘數指派給變數。 因此,下列語句是相等的:
$a %= 2
$a = ($a % 2)
下列範例示範如何使用 %= 運算子來儲存商數的模數:
$a = 7
$a %= 4
$a
3
遞增和遞減運算符
遞增運算子 ++ 將變數的值增加 1。 當您在簡單語句中使用遞增運算符時,不會傳回任何值。 若要檢視結果,請顯示變數的值,如下所示:
$a = 7
++$a
$a
8
若要強制傳回值,請將變數和運算符括在括弧中,如下所示:
$a = 7
(++$a)
8
遞增運算符可以放在變數之前(前置運算符)或之後(後置運算符)。 運算子的前置詞版本會在 語句中使用變數值之前遞增變數,如下所示:
$a = 7
$c = ++$a
$a
8
$c
8
運算子的後置版本會在語句中使用完變數值後才遞增變數。 在下列範例中,$c 和 $a 變數具有不同的值,因為值會在 $c 變更之前指派給 $a:
$a = 7
$c = $a++
$a
8
$c
7
遞減運算子 -- 將變數的值減少 1。 如同遞增運算符,當您在簡單語句中使用 運算符時,不會傳回任何值。 使用括弧傳回值,如下所示:
$a = 7
--$a
$a
6
(--$a)
5
運算子的前置詞版本會在 語句中使用變數值之前遞減變數,如下所示:
$a = 7
$c = --$a
$a
6
$c
6
運算子的後置版本會在語句中使用變數值之後遞減變數。 在下列範例中,$d 和 $a 變數具有不同的值,因為值會在 $d 變更之前指派給 $a:
$a = 7
$d = $a--
$a
6
$d
7
空合併指派運算子
null 聯合指派運算符 ??= 只有在左邊的操作數評估為 null 時,才會將其右邊操作數的值指派給左邊的操作數。 如果左側操作數評估為非 Null,則 ??= 運算符不會評估其右側操作數。
$x = $null
$x ??= 100
$x
100
如需詳細資訊,請參閱 空合併運算子。
Microsoft .NET 類型
根據預設,當變數只有一個值時,指派給變數的值會決定變數的數據類型。 例如,下列命令會建立具有 System.Int32 類型的變數:
$a = 6
若要尋找變數的 .NET 類型,請使用 GetType 方法及其 FullName 屬性。 即使方法呼叫沒有自變數,請務必在 getType 方法名稱
$a = 6
$a.GetType().FullName
System.Int32
若要建立包含字串的變數,請將字串值指派給變數。 若要指出值是字串,請以引弧括住它,如下所示:
$a = "6"
$a.GetType().FullName
System.String
如果指派給變數的第一個值是字串,PowerShell 會將所有作業視為字串作業,並將新的值轉換成字串。 這種情況發生在下列範例中:
$a = "file"
$a += 3
$a
file3
如果第一個值是整數,PowerShell 會將所有作業視為整數作業,並將新的值轉換成整數。 這種情況發生在下列範例中:
$a = 6
$a += "3"
$a
9
您可以將新的 純量 變數轉換成任何 .NET 類型,方法是將類型名稱放在變數名稱或第一個指派值之前的括弧中。 當您轉換變數時,您會定義可儲存在變數中的數據類型。
例如,下列命令會將變數轉換成字串類型:
[string]$a = 27
$a += 3
$a
273
下列範例會轉換第一個值,而不是轉換變數:
$a = [string]27
如果現有變數的值無法轉換成新的數據類型,就無法重新轉換現有變數的數據類型。
$a = "string"
[int]$a
InvalidArgument: Cannot convert value "string" to type "System.Int32". Error:
"The input string 'string' was not in a correct format."
若要變更資料類型,您必須取代其值,如下所示:
[int]$a = 3
此外,當您在變數名稱前面加上資料型態時,除非您藉由指定另一個資料型態來明確覆寫型態,否則該變數的型態會鎖定。 如果您嘗試指派與現有類型不相容的值,且未明確覆寫類型,PowerShell 會顯示錯誤,如下列範例所示:
$a = 3
$a = "string"
[int]$a = 3
$a = "string"
MetadataError:
Line |
2 | $a = "string"
| ~~~~~~~~~~~~~
| Cannot convert value "string" to type "System.Int32". Error: "The input
string 'string' was not in a correct format."
[string]$a = "string"
在 PowerShell 中,包含多個項目(例如陣列)的變數數據類型與包含單一項目的變數數據類型的處理方式不同。 除非資料類型特別指派給陣列變數,否則資料類型一律 System.Object []。 此數據類型是陣列特有的。
有時候,您可以藉由指定另一個類型來覆蓋預設類型。 例如,下列命令會將變數轉換成 string [] 陣列類型:
[string []] $a = "one", "two", "three"
PowerShell 變數可以是任何 .NET 數據類型。 此外,您可以指派目前程式中可用的任何完整 .NET 數據類型。 例如,下列命令會指定 System.DateTime 資料類型:
[System.DateTime]$a = "5/31/2005"
變數將會指派符合 System.DateTime 數據類型的值。
$a 變數的值如下:
Tuesday, May 31, 2005 12:00:00 AM
指派多個變數
在 PowerShell 中,您可以使用單一命令將值指派給多個變數。 指派值的第一個元素會指派給第一個變數,第二個元素會指派給第二個變數,第三個元素會指派給第三個變數。 這稱為 多重指派。
例如,下列命令會將值 1 指派給 $a 變數、將值 2 指派給 $b 變數,並將值 3 指派給 $c 變數:
$a, $b, $c = 1, 2, 3
如果指派值包含的元素數目超過變數,則所有剩餘的值都會指派給最後一個變數。 例如,下列命令包含三個變數和五個值:
$a, $b, $c = 1, 2, 3, 4, 5
因此,PowerShell 會將值 1 指派給 $a 變數,並將值 2 指派給 $b 變數。 它會將值 3、4 和 5 指派給 $c 變數。
若要將 $c 變數中的值指派給其他三個變數,請使用下列格式:
$d, $e, $f = $c
此命令會將值 3 指派給 $d 變數、值 4 指派給 $e 變數,並將值 5 指派給 $f 變數。
如果指派值中的元素少於變數,則其餘的變數會被指派值 $null。 例如,下列命令包含三個變數和兩個值:
$a, $b, $c = 1, 2
因此,PowerShell 會將值 1 指派給 $a 變數,並將值 2 指派給 $b 變數。
$c 變數 $null。
您也可以藉由鏈結變數,將單一值指派給多個變數。 例如,下列命令會將 「three」 的值指派給這四個變數:
$a = $b = $c = $d = "three"
變數相關 Cmdlet
除了使用指派作業來設定變數值之外,您也可以使用 Set-Variable Cmdlet。 例如,下列命令會使用 Set-Variable,將 1、 2、 3 的陣列指派給 $a 變數。
Set-Variable -Name a -Value 1, 2, 3