关于赋值运算符

简短说明

介绍如何使用运算符将值分配给变量。

长说明

赋值运算符将一个或多个值分配给变量。 他们可以在赋值前对值执行数值运算。

PowerShell 支持以下赋值运算符。

运算符 说明
= 将变量的值设置为指定的值。
+= 按指定值增加变量的值,或
将指定的值追加到现有值。
-= 按指定值减小变量的值。
*= 将变量的值乘以指定的值,或
将指定的值追加到现有值。
/= 将变量的值除以指定的值。
%= 将变量的值除以指定的值和
然后将余数 (取模) 赋给变量。
++ 增加变量、可赋值属性的值,或
数组元素由 1。
-- 减小变量、可赋值属性或
数组元素由 1。

语法

赋值运算符的语法如下所示:

<assignable-expression> <assignment-operator> <value>

可分配的表达式包括变量和属性。 该值可以是单个值、值数组或命令、表达式或语句。

增量和递减运算符是一元运算符。 每个都有前缀和后缀版本。

<assignable-expression><operator> <operator><assignable-expression>

可赋值表达式必须是数字,或者它必须可转换为数字。

赋值

变量是存储值的命名内存空间。 使用赋值运算符 =将值存储在变量中。 新值可以替换变量的现有值,也可以将新值追加到现有值。

基本赋值运算符是等号 =(ASCII 61)。 例如,以下语句将值 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$a不小于零,则它将 的值$b赋给 。

赋值运算符

赋值运算符 = 将值分配给变量。 如果变量已具有值,则赋值运算符 = 将替换该值而不发出警告。

以下语句将整数值 6 分配给 $a 变量:

$a = 6

若要将字符串值分配给变量,请将字符串值括在引号中,如下所示:

$a = "baseball"

若要将数组 (多个值) 分配给变量,请使用逗号分隔值,如下所示:

$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

按加法运算符赋值

加法赋值运算符 += 递增变量的值,或将指定值追加到现有值。 操作取决于变量是具有数值类型还是字符串类型,以及变量是否包含单个值 (标量) 还是多个值 (集合) 。

运算符 += 将两个运算组合在一起。 首先,它添加 ,然后进行分配。 因此,以下语句是等效的:

$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
You can add another hash table only to a hash table.
At line:1 char:6
+ $a += <<<<  1

减法运算符赋值

减法运算符 -= 赋值按运算符右侧指定的值递减变量的值。 此运算符不能与字符串变量一起使用,也不能用于从集合中删除元素。

运算符 -= 将两个运算组合在一起。 首先,它减去,然后进行赋值。 因此,以下语句是等效的:

$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

按 modulus 运算符赋值

按模数赋值运算符 %= 将变量的值除以运算符右侧的值。 然后, %= 运算符将余数 (称为) 模数分配给变量。 仅当变量包含单个数值时,才能使用此运算符。 当变量包含字符串变量或数组时,不能使用此运算符。

运算符 %= 将两个运算组合在一起。 首先,它划分并确定余数,然后将余数分配给变量。 因此,以下语句是等效的:

$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

Microsoft .NET Framework类型

默认情况下,当变量只有一个值时,分配给变量的值将确定变量的数据类型。 例如,以下命令创建一个具有“Integer” (System.Int32) 类型的变量:

$a = 6

若要查找变量.NET Framework类型,请使用 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 Framework类型,方法是将类型名称置于变量名称或第一个赋值值之前的方括号中。 强制转换变量时,可以确定变量中可以存储的数据类型。 并且,可以在操作变量时确定变量的行为方式。

例如,以下命令将变量强制转换为字符串类型:

[string]$a = 27
$a += 3
$a
273

以下示例强制转换第一个值,而不是强制转换变量:

$a = [string]27

将变量强制转换为特定类型时,常见的约定是强制转换变量,而不是转换值。 但是,如果现有变量的值无法转换为新的数据类型,则无法重新转换该变量的数据类型。 若要更改数据类型,必须替换其值,如下所示:

$a = "string"
[int]$a
Cannot convert value "string" to type "System.Int32". Error: "Input string was
not in a correct format." At line:1 char:8 + [int]$a <<<<
[int]$a = 3

此外,在变量名称前面加上数据类型时,该变量的类型将被锁定,除非通过指定另一数据类型显式重写该类型。 如果尝试分配与现有类型不兼容的值,并且未显式重写该类型,则 PowerShell 将显示错误,如以下示例所示:

$a = 3
$a = "string"
[int]$a = 3
$a = "string"
Cannot convert value "string" to type "System.Int32". Error: "Input
string was not in a correct format."
At line:1 char:3
+ $a <<<<  = "string"
[string]$a = "string"

在 PowerShell 中,数组中包含多个项的变量的数据类型的处理方式不同于包含单个项的变量的数据类型。 除非数据类型专门分配给数组变量,否则数据类型始终 System.Object []为 。 此数据类型特定于数组。

有时,可以通过指定另一种类型来替代默认类型。 例如,以下命令将变量强制转换为 string [] 数组类型:

[string []] $a = "one", "two", "three"

PowerShell 变量可以是任何.NET Framework数据类型。 此外,还可以分配当前进程中可用的任何完全限定.NET Framework数据类型。 例如,以下命令指定 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 变量。

如果赋值包含的元素少于变量,则末尾的所有剩余变量都不会分配任何值。 例如,以下命令包含三个变量和两个值:

$a, $b, $c = 1, 2

因此,PowerShell 将值 1 分配给变量, $a 将值 2 分配给 $b 变量。 它不会为变量赋值 $c

还可以通过链接变量将单个值分配给多个变量。 例如,以下命令将值“three”分配给所有四个变量:

$a = $b = $c = $d = "three"

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

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

另请参阅

about_Arrays

about_Hash_Tables

about_Variables

Clear-Variable

Remove-Variable

Set-Variable