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 }
如果 $a
的值小于零,则此示例将零分配给 $b
变量。 如果 $b
的值不小于零,则它将 $a
的值分配给 $b
。
若要将数组(多个值)分配给变量,请使用逗号分隔值,如下所示:
$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
转换为字节。 例如,若要为 $a
变量赋值 10 千字节,请键入:
$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-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 合并赋值运算符 ??=
才会将其右操作数的值赋值给其左操作数。 如果左操作数的计算结果为非 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