当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 变量

作者:精品下载站 日期:2024-12-14 02:56:07 浏览:15 分类:玩电脑

变量


变量代表值的存储位置,并且该值具有类型。传统的过程式编程语言是静态类型的;也就是说,变量的运行时类型是在编译时声明的类型。面向对象语言添加了继承的思想,它允许变量的运行时类型是编译时声明的类型或从该类型派生的某种类型。作为一种动态类型语言,PowerShell 的变量本身没有类型。事实上,变量并没有被定义;它们只是在第一次被赋予值时就产生了。虽然变量可能被限制(第 5.3 节)保存给定类型的值,但赋值中的类型信息并不总是能够静态验证。

在不同时间,变量可以通过赋值(第 7.11 节)或使用 ++-- 运算符(第 7.1.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 键,其对应值为 $h1['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.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:Alias: 或文件系统命名空间(§2.3.2、§3.1)的任何变量都隐式约束为类型 字符串。属于命名空间 Function:(第 2.3.2 节、第 3.1 节)的任何变量都隐式约束为 scriptblock 类型。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯