5. 变量

编辑说明

重要

Windows PowerShell 语言规范 3.0 于 2012 年 12 月发布,基于 Windows PowerShell 3.0。 此规范不反映 PowerShell 的当前状态。 没有计划更新本文档以反映当前状态。 此处提供了本文档供历史参考。

该规范文档可在Microsoft下载中心获取为Microsoft Word格式的文档:https://www.microsoft.com/download/details.aspx?id=36389。这份Word文档已在此Microsoft Learn上转换以便于展示。 转换期间,进行了一些编辑更改,以适应 Docs 平台的格式设置。 已更正某些拼写错误和次要错误。

变量表示值的存储位置,并且该值具有类型。 传统的过程编程语言是静态类型的;也就是说,变量在编译时声明的类型就是其运行时的类型。 面向对象的语言引入了继承的概念,这允许变量的运行时类型可以是编译时声明的类型或从该类型派生的某种类型。 作为动态类型化语言,PowerShell 的变量本身没有类型。 事实上,变量并不是预先定义的;它们只是第一次被赋值时才出现。 虽然变量可能受到限制(§5.3)以保留给定类型的值,但赋值中的类型信息不能始终静态验证。

在不同时间,变量可以通过赋值(§7.11)或 ++‑‑ 运算符(§7.1.5§7.2.6)与不同类型的值相关联。 当与变量关联的值发生更改时,该值的类型可能会更改。 例如,

$i = "abc"        # $i holds a value of type string
$i = 2147483647   # $i holds a value of type int
++$i              # $i now holds a value of type double because
                  # 2147483648 is too big to fit in type int

未创建的变量的任何使用都会导致值$null。 若要查看是否已定义变量,请使用 Test-Path cmdlet。

5.1 可写位置

可写位置 是一个表达式,它指定命令具有读取和写入访问权限的资源。 可写位置可以是变量(§5)、数组元素(§9)、通过下标(§10)访问的哈希表中的关联值、属性(§7.1.2)或提供程序管理的存储(§3.1)。

5.2 变量类别

PowerShell 定义了以下类别的变量:静态变量、实例变量、数组元素、哈希表键/值对、参数、普通变量和提供程序驱动器上的变量。 后面的子节描述了这些类别中的每一个。

在以下示例中

function F ($p1, $p2) {
    $radius = 2.45
    $circumference = 2 * ([Math]::PI) * $radius

    $date = Get-Date -Date "2010-2-1 10:12:14 pm"
    $month = $date.Month

    $values = 10, 55, 93, 102
    $value = $values[2]

    $h1 = @{ FirstName = "James"; LastName = "Anderson" }
    $h1.FirstName = "Smith"

    $Alias:A = "Help"
    $Env:MyPath = "E:\Temp"
    ${E:output.txt} = 123
    $Function:F = { "Hello there" }
    $Variable:v = 10
}
  • [Math::PI] 是静态变量
  • $date.Month 是实例变量
  • $values[2] 是数组元素
  • $h1.FirstName 是一个 Hashtable 键,其相应的值为 $h 1['FirstName']'
  • $p1$p2 是参数
  • $radius$circumference$date$month$values$value$h1 都是普通变量
  • $Alias:A$Env:MyPath${E:output.txt}$Function:F 是相应提供程序驱动器上的变量。
  • $Variable:v 实际上是一个用其完全限定的提供程序驱动器编写的普通变量。

5.2.1 静态变量

对象中属于该对象的类型而不属于该类型的特定实例的数据成员称为静态变量。 有关一些示例,请参阅 §4.2.3§4.2.4.1§4.3.8

PowerShell 无法创建包含静态变量的新类型;但是,此类类型的对象可能由主机环境提供。

用于创建和删除包含静态变量的对象的内存由主机环境和垃圾回收系统管理。

有关访问静态变量的信息,请参阅 §7.1.2

静态数据成员可以是字段或属性。

5.2.2 实例变量

属于对象类型的特定实例(而不是类型本身)的数据成员称为 实例变量。 有关一些示例,请参阅 §4.3.1§4.3.2§4.3.3

PowerShell 主机环境可能提供创建包含实例变量的新类型或向现有类型添加新实例变量的方法。

用于创建和删除包含静态变量的对象的内存由主机环境和垃圾回收系统管理。

有关访问实例变量的信息,请参阅 §7.1.2

实例数据成员可以是字段或属性。

5.2.3 数组元素

可以通过一元逗号运算符(§7.2.1)、子表达式§7.1.6数组表达式§7.1.6)创建数组§7.1.7)、二进制逗号运算符(§7.3)、范围运算符(§7.4),或 New-Object cmdlet。

用于创建和删除数组的内存由主机环境和垃圾回收系统管理。

§9中讨论了数组和数组元素。

5.2.4 哈希表键/值对

哈希表是通过哈希文本(§2.3.5.6)或 New-Object cmdlet 创建的。 可以通过 [] 运算符(§7.1.4.3)添加新的键/值对。

用于创建和删除哈希表的内存由主机环境和垃圾回收系统管理。

哈希表在 §10 中介绍。

5.2.5 参数

调用其父命令时会创建一个参数,并使用调用或主机环境中提供的参数值进行初始化。 当参数的父命令终止时,参数将停止存在。

参数在 §8.10中讨论。

5.2.6 普通变量

普通变量赋值表达式 (§7.11) 或 foreach 语句 (§8.4.4) 定义。 某些普通变量由主机环境预定义,而另一些是暂时性的变量,会在运行时根据需要出现和消失。

普通变量的生存期是程序执行的一部分,在此期间,可以保证为其保留存储。 此生命周期从进入与其关联的作用域开始,并在该作用域执行结束之前结束。 如果父范围以递归方式或迭代方式输入,则每次都会创建局部变量的新实例。

普通变量所引用的存储空间是在独立于该变量生存期的情况下进行回收的。

普通变量可以使用 Variable: 命名空间前缀 (§5.2.7) 显式命名。

5.2.7 提供程序驱动器上的变量

提供者和驱动器的概念在 §3.1中引入,每个提供者都可以提供自己的命名空间驱动器。 这允许访问这些驱动器上的资源,就像它们是普通变量一样(§5.2.6)。 事实上,普通变量存储在文件系统提供程序驱动器变量上:(§3.1.5),可通过其普通名称或其完全限定的命名空间名称进行访问。

某些命名空间变量类型被隐式约束(§5.3)。

5.3 约束变量

默认情况下,变量可以指定任何类型的值。 然而,在赋值或参数中,通过在变量名前指定类型作为类型文本来指定给定类型的值,变量可能受到约束。 例如,

[int]$i = 10   # constrains $i to designating ints only
$i = "Hello"   # error, no conversion to int
$i = "0x10"    # ok, conversion to int
$i = $true     # ok, conversion to int

function F ([int]$p1, [switch]$p2, [regex]$p3) { ... }

属于命名空间 Env:别名:或文件系统命名空间(§2.3.2§3.1)的任何变量都隐式限制为类型 string。 属于命名空间 函数的任何变量:§2.3.2§3.1)隐式限制为类型 scriptblock