about_Assignment_Operators
簡短描述
描述如何使用運算子將值指派給變數。
詳細描述
指派運算子會將一或多個值指派給變數。 等號 (=
) 是 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 }
如果 的值$b
小於零,$a
本範例會將零指派給 變數。 如果的值不小於零,則會將 的值$b
$b
指派給 $a
。
若要將陣列 (多個值) 指派給變數,請使用逗號分隔值,如下所示:
$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 指派給 $a
變數的 1,000,請輸入:
$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
若要將陣列的元素相乘,請使用索引來識別您要相乘的專案。 例如,下列命令會將陣列中的第一個專案乘以 2:0:
$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 時,才會將右操作數的值指派給其左側操作數。 如果左方運算元評估為非 Null,??=
運算子不會評估其右方運算元。
$x = $null
$x ??= 100
$x
100
如需詳細資訊,請參閱 Null 聯合運算符。
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
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應