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 中的标准哈希表表示法。 键入 at 符号 @,后跟用分号 ; 分隔的键/值对,并用大括号 { } 括起来。 例如,若要将哈希表赋给 $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、兆字节 MB 和千兆字节 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

还可以使用 -= 赋值运算符来减小数值数组的成员的值。 为此,请指定要更改的数组元素的索引。 在以下示例中,数组(元素 2)的第三个元素的值将减少 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 变量具有不同的值,因为该值在 $a 更改之前赋给 $c

$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 变量具有不同的值,因为该值在 $a 更改之前赋给 $d

$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"

除了使用赋值运算设置变量值之外,还可以使用 Set-Variable cmdlet。 例如,以下命令使用 Set-Variable 将 1、2、3 的数组赋给 $a 变量。

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

另请参阅