關於指定運算子

簡短描述

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

完整描述

指派運算子會將一或多個值指派給變數。 等號 (=) 是 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-ItemClear-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"

除了使用指派作業來設定變數值之外,您也可以使用 Set-Variable Cmdlet。 例如,下列命令會使用 Set-Variable,將 1、 2、 3 的陣列指派給 $a 變數。

Set-Variable -Name a -Value 1, 2, 3

另請參閱