about_assignment_operators

主题
    about_assignment_operators

简短说明
    说明如何使用运算符向变量赋值。


详细说明
    赋值运算符可向一个变量赋予一个或多个值。赋值运算符可以在赋值之前对值执行数值运算。


    Windows PowerShell 支持以下赋值运算符。


    运算符    说明
    -------   -----------
    =         将变量的值设置为指定值。

    +=        使变量的值增加指定值,或将指定值追加到现有值。
 
    -=        使变量的值减少指定值。
 
    *=        将变量的值与指定值相乘,或将指定值追加到现有值。
 
    /=        将变量的值除以指定值。
 
    %=        将变量的值除以指定值,然后将余数(模)赋予变量。

    ++        使变量、可赋值属性或数组元素的值增加 1。

    --        使变量、可赋值属性或数组元素的值减少 1。
 

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


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


    可赋值表达式包括变量和属性。值可以是单个值、值数组,也可以是命令、表达式或语句。


    递增和递减运算符是一元运算符。都有前缀和后缀形式。


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


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


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


    基本赋值运算符是等号 (=)(ASCII 61)。例如,下面的语句将值 Windows PowerShell 赋予 
    $MyShell 变量:


        $MyShell = "Windows PowerShell"


    在 Windows PowerShell 中向变量赋值时,如果该变量尚不存在,则会创建该变量。例如,下面两
    条赋值语句中的第一条创建 $a 变量并将值 6 赋予 $a。第二条赋值语句将值 12 赋予 $a。第一条
    语句创建一个新变量。第二条语句只更改该变量的值:


        $a = 6
        $a = 12

 
    Windows PowerShell 中的变量没有特定数据类型,除非进行转换。如果变量仅包含一个对象,则变
    量采用该对象的数据类型。如果变量包含对象集合,则变量为 System.Object 数据类型。因此,可以
    向该集合赋予任何类型的对象。下面的示例演示可以向变量添加进程对象、服务对象、字符串和整数,
    而不会生成错误:


        $a = get-process
        $a += get-service
        $a += "string"
        $a += 12
 

    因为赋值运算符 (=) 的优先级低于管道运算符 (|),所以在将命令管道的结果赋予变量时不需要圆括
    号。例如,下面的命令对计算机上的服务进行排序,然后将排序后的服务赋予 $a 变量:


        $a = get-service | sort name


    还可以将语句创建的值赋予变量,如下面的示例所示:


        $a = if ($b -lt 0) { 0 } else { $b }


    此示例在 $b 的值小于 0 时将 0 赋予 $a 变量。如果 $b 的值不小于零,
    则将 $b 的值赋予 $a。

 

  赋值运算符 (=)
    赋值运算符 (=) 可以为变量赋值。如果变量已有值,则赋值运算符 (=) 替换该值而不会发出警告。


    下面的语句将整数值 6 赋予 $a 变量:


        $a = 6

    要将字符串值赋予变量,请将字符串值括在引号中,如下所示:


        $a = "baseball"


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


        $a = "apple", "orange", "lemon", "grape"

    要将哈希表赋予变量,请使用 Windows PowerShell 中的标准哈希表表示法。键入一个 at 符号 
    (@),在其后键入使用分号 (;) 分隔、括在大括号 ({ }) 内的键/值对。例如,若要将哈希表赋予 
    $a 变量,请键入:


        $a = @{one=1; two=2; three=3}


    要将十六进制值赋予变量,请在值前面加上"0x"。Windows PowerShell 会将十六进制值 (0x10) 
    转换为十进制值(本例中为 16),然后将该值赋予 $a 变量。例如,若要将值 0x10 赋予变量 $a,
    请键入:


        $a = 0x10


    要将指数值赋予变量,请键入根数字、字母"e"和一个表示 10 的倍数的数字。例如,若要将 
    3.1415 的 1,000 次幂值赋予 $a 变量,请键入:


        $a = 3.1415e3


    Windows PowerShell 还可以将千字节 (KB)、兆字节 (MB) 和千兆字节 (GB) 转换为字节。例
    如,如要将值 10 千字节赋予 $a 变量,请键入:


        $a = 10kb


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


    += 运算符组合了两个运算。首先执行加法,然后赋值。因此,以下语句是等效的:


        $a += 2
        $a = ($a + 2)

 
    如果变量包含单个数字值,则 += 运算符使现有值增加该运算符右侧的数量。然后,该运算符将得到的
    值赋予变量。下面的示例演示如何使用 += 运算符增加变量的值:


        C:\PS> $a = 4
        C:\PS> $a += 2
        C:\PS> $a
        6
 

    如果变量的值是字符串,则将该运算符右侧的值追加到该字符串,如下所示:


        C:\PS> $a = "Windows"
        C:\PS> $a += " PowerShell"
        C:\PS> $a
        Windows PowerShell


    如果变量的值是数组,则 += 运算符将其右侧的值追加到数组。除非通过转换显式指定数组的类型,
    否则可以将任何类型的值追加到数组,如下所示:


        C:\PS> $a = 1,2,3
        C:\PS> $a += 2
        C:\PS> $a
        1
        2
        3
        2
        C:\PS> $a += "String"
        C:\PS> $a
        1
        2
        3
        2
        String

 
    如果变量的值是哈希表,则 += 运算符将其右侧的值追加到该哈希表。不过,因为只能向哈希表添加另
    一个哈希表,所以所有其他赋值都会失败。


    例如,下面的命令将哈希表赋予 $a 变量。
    然后,该命令使用 += 运算符将另一个哈希表追加到现有哈希表,实际上是将一个新键/值对添加到现
    有哈希表。此命令成功,输出如下所示:


        C:\PS> $a = @{a = 1; b = 2; c = 3}
        C:\PS> $a += @{mode = "write"}
        C:\PS> $a
        名称                           值
        ----                           -----
        a                              1
        b                              2
        mode                           write
        c                              3


    下面的命令试图将一个整数 (1) 追加到 $a 变量中的哈希表。此命令将失败:


        C:\PS> $a = @{a = 1; b = 2; c = 3}
        C:\PS> $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)

 
    下面的示例演示如何使用 -= 运算符减少变量的值:


        C:\PS> $a = 8
        C:\PS> $a -= 2
        C:\PS> $a
        6

 
    还可以使用 -= 赋值运算符减少数值数组的成员的值。为此,请指定要更改的数组元素的索引。在下面
    的示例中,数组中第三个元素(元素 2)的值减少 1:


        C:\PS> $a = 1,2,3
        C:\PS> $a[2] -= 1.
        C:\PS> $a
        1
        2
        2

 
    不能使用 -= 运算符删除变量的值。要删除赋予变量的所有值,请使用 Clear-Item 或 Clear-
    Variable cmdlet 将值 $null 或 "" 赋予变量。


        $a = $null


    要从数组中删除特定值,请使用数组表示法将值 $null 赋予该特定项。例如,下面的语句从数组中删
    除第二个值(索引位置 1):



        C:\PS> $a = 1,2,3
        C:\PS> $a
        1
        2
        3

        C:\PS> $a[1] = $null
        C:\PS> $a
        1
        3
 

    要删除变量,请使用 Remove-Variable cmdlet。在变量已显式转换为特定数据类型,而您需要非
    类型化变量时,可以使用此方法。下面的命令删除 $a 变量:


        remove-variable a
 

  乘法赋值运算符 (*=) 乘法赋值运算符 (*=) 对数字值执行乘法或追加指定数目的变量字符串值副本。


    如果变量包含单个数字值,则将该值与运算符右侧的值相乘。例如,下面的示例演示如何使用 *= 运算
    符对变量的值执行乘法:


        C:\PS> $a = 3
        C:\PS> $a *= 4
        C:\PS> $a
        12
 

    在此示例中,*= 运算符组合了两个运算。首先执行乘法,然后赋值。因此,以下语句是等效的:


        $a *= 2
        $a = ($a * 2)

 
    如果变量包含字符串值,则 Windows PowerShell 将指定数目的字符串追加到该值,如下所示:


        C:\PS> $a = "file"
        C:\PS> $a *= 4
        C:\PS> $a
        filefilefilefile

 
    要对数组的元素执行乘法,请使用索引标识要执行乘法的元素。例如,下面的命令使数组中第一个元素
    (索引位置 0)乘以 2:


        $a[0] *= 2
 

  除法赋值运算符 (/=)
    除法赋值运算符 (/=) 使数字值除以在运算符右侧指定的值。该运算符不能用于处理字符串变量。


    /= 运算符组合了两个运算。首先执行除法,然后赋值。因此,以下两个语句是等效的:


        $a /= 2
        $a = ($a / 2)

 
    例如,下面的命令使用 /= 运算符对变量的值执行除法:


        C:\PS> $a = 8
        C:\PS> $a /=2
        C:\PS> $a
        4

 
    要对数组的元素执行除法,请使用索引标识要更改的元素。例如,下面的命令将数组中第二个元素
    (索引位置 1)除以 2:


        $a[1] /= 2
 

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


    %= 运算符组合了两个运算。首先,执行除法运算并确定余数,然后将余数赋予变量。因此,以下语句
    是等效的:


        $a %= 2
        $a = ($a % 2)

 
    下面的示例演示如何使用 %= 运算符保存商的模:


        C:\PS> $a = 7
        C:\PS> $a %= 4
        C:\PS> $a
        3


  递增和递减运算符

    递增运算符 (++) 使变量的值增加 1。在简单语句中使用递增运算符时,不返回任何值。
    要查看结果,请显示变量的值,如下所示:


        C:\PS> $a = 7
        C:\PS> ++$a
        C:\PS> $a
        8


    要强制返回值,请将变量和运算符括在圆括号内,如下所示:


        C:\PS> $a = 7
        C:\PS> (++$a)
        8


    递增运算符可以放在变量之前(前缀)或之后(后缀)。该运算符的前缀形式在变量的值
    用于语句之前使变量递增,如下所示:


        C:\PS> $a = 7
        C:\PS> $c = ++$a
        C:\PS> $a
        8
        C:\PS> $c
        8


    该运算符的后缀形式在变量的值用于语句之后使变量递增。在下面的示例中,$c 和 $a 变量具有不同
    的值,因为是在 $a 更改之前向 $c 赋值:


        C:\PS> $a = 7
        C:\PS> $c = $a++
        C:\PS> $a
        8
        C:\PS> $c
        7


    递减运算符 (--) 使变量的值减少 1。与递增运算符一样,在简单语句中使用递减运算符时,不返回
    任何值。使用圆括号可返回值,如下所示:


        C:\PS> $a = 7
        C:\PS> --$a
        C:\PS> $a
        6
        C:\PS> (--$a)
        5


    该运算符的前缀形式在变量的值用于语句之前使变量递减,如下所示:


        C:\PS> $a = 7
        C:\PS> $c = --$a
        C:\PS> $a
        6
        C:\PS> $c
        6


    该运算符的后缀形式在变量的值用于语句之后使变量递减。在下面的示例中,$d 和 $a 变量具有不同
    的值,因为是在 $a 更改之前向 $d 赋值:


        C:\PS> $a = 7
        C:\PS> $d = $a--
        C:\PS> $a
        6
        C:\PS> $d
        7


  MICROSOFT .NET FRAMEWORK 类型
    默认情况下,当变量只有一个值时,由赋予变量的值确定变量的数据类型。例如,下面的命令创建一个
    整数 (System.Int32) 类型的变量:


        $a = 6


    要确定变量的 .NET Framework 类型,请使用 GetType 方法及其 FullName 属性,如下所示。
    请务必在 GetType 方法名称之后包括圆括号,即使该方法调用没有任何参数:


        C:\PS> $a = 6
        C:\PS> $a.gettype().fullname
        System.Int32


    要创建包含字符串的变量,请将字符串值赋予变量。要指示值为字符串,请将值括在引号中,如下所示:


        C:\PS> $a = "6"
        C:\PS> $a.gettype().fullname
        System.String

 
    如果赋予变量的第一个值是字符串,则 Windows PowerShell 将所有运算都视为字符串运算,并将
    新值转换为字符串。下面的示例即是这种情况:


        C:\PS> $a = "file"
        C:\PS> $a += 3
        C:\PS> $a
        file3

 
    如果第一个值是整数,则 Windows PowerShell 将所有运算都视为整数运算,并将新值转换为整
    数。下面的示例即是这种情况:


        C:\PS> $a = 6
        C:\PS> $a += "3"
        C:\PS> $a
        9

 
    通过将类型名称放在变量名称或第一个所赋值前面的方括号中,可以将新的标量变量转换为任何 .NET 
    Framework 类型。在转换变量时,可以确定该变量所能存储的数据的类型。同时,还可以确定填充变
    量时的变量行为方式。


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


        C:\PS> [string]$a = 27
        C:\PS> $a += 3
        C:\PS> $a
        273
 

    下面的示例转换第一个值,而不是转换变量:


        $a = [string]27

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


        C:\PS> $a = "string"
        C:\PS> [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 <<<<

        C:\PS> [int]$a =3
 

    此外,将数据类型放在变量名称的前面会锁定变量的类型,除非通过指定
    另一个数据类型显式覆盖该类型。如果试图赋予与现有类型不兼容的值,
    并且未显式覆盖该类型,则 Windows PowerShell 将显示错误,如下面的示例所示:


        C:\PS> $a = 3
        C:\PS> $a = "string"

        C:\PS> [int]$a = 3
        C:\PS> $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"

        C:\PS> [string]$a = "string"
 

    在 Windows PowerShell 中,通过数组包含多个项的变量的数据类型的处理方式与包含单个项的变
    量的数据类型不同。除非明确向数组变量指定数据类型,否则其数据类型始终是 System.Object []。
    此数据类型是特定于数组的。


    有时,可以通过指定另一个类型来覆盖默认类型。例如,下面的命令将变量转换为 string [] 
    数组类型:



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

    Windows PowerShell 变量可以是任何 .NET Framework 数据类型。此外,可以赋予在当前进程
    中可用的任何完全限定的 .NET Framework 数据类型。例如,下面的命令指定 System.DateTime 
    数据类型:


        [system.datetime]$a = "5/31/2005"

 
    这会将符合 System.DateTime 数据类型的值赋予变量。$a 变量的值如下所示:


        Tuesday, May 31, 2005 12:00:00 AM


  为多个变量赋值
    在 Windows PowerShell 中,可以使用单个命令对多个变量赋值。所赋值的第一个元素将赋予第一
    个变量,第二个元素赋予第二个变量,第三个元素赋予第三个变量,依此类推。例如,下面的命令将值 
    1 赋予 $a 变量,将值 2 赋予 $b 变量,并将值 3 赋予 $c 变量:


        C:\PS> $a, $b, $c = 1, 2, 3

 
    如果所赋值包含的元素个数超过变量数,则将所有剩余的值都赋予最后一个变量。
    例如,下面的命令包含三个变量和五个值:


        $a, $b, $c = 1, 2, 3, 4, 5

 
    因此,Windows PowerShell 将值 1 赋予 $a 变量并将值 2 赋予 $b 变量,而将值 3、4 和 5 
    赋予 $c 变量。要将 $c 变量中的值赋予另外三个变量,请使用下面的格式:


        $d, $e, $f = $c


    此命令将值 3 赋予 $d 变量,将值 4 赋予 $e 变量,并将值 5 赋予 $f 变量。


    通过串联变量,还可以将单个值赋予多个变量。例如,以下命令将值"three"赋予所有四个变量:


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

    
  与变量相关的 CMDLET
    除了使用赋值运算来设置变量值以外,还可以使用 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