购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

PowerShell变量有多种形式( 类型 )。本书篇幅有限,无法一一介绍PowerShell的数据类型。你只需要知道,PowerShell有多种数据类型,包括布尔值、字符串和整数,而且修改变量的数据类型不会报错。下列代码可以正常运行,没有错误。

PS> $foo = 1
PS> $foo = 'one'
PS> $foo = $true

这是因为PowerShell能根据变量的值确定数据类型。背后的原理有点儿复杂,超出了本书范畴。你要做的是了解基本的类型以及类型之间的关系。

大多数编程语言会使用 布尔值 。该类型有两个值,真值(1)和假值(0)。布尔值用于表示双值条件,就像电灯开关那样,可开可关。在PowerShell中,布尔值称作bools,两个值分别使用自动变量 $true $false 表示。这两个自动变量被写“死”在了PowerShell中,不可修改。代码清单2-11展示了如何将变量的值设为 $true $false

代码清单2-11 创建布尔值变量

PS> $isOn = $true
PS> $isOn
True

第4章将多次使用布尔值。

PowerShell中的数字主要使用两种方式表示:整数数据类型和浮点数数据类型。

  1. 整数类型

    整数数据类型只存储整数,小数部分会四舍五入为最近的整数。整数数据类型分为 带符号 不带符号 两种。带符号的整数数据类型既可以存储正数,也可以存储负数;不带符号的整数数据类型则只能存储没有正负号的值。

    在默认情况下,PowerShell会使用32位带符号的 Int32 类型存储整数。位数决定了一个变量可以存储多大(或多小)的数, Int32 可存储的整数范围为 -2 147 483 648到2 147 483 647。如果一个数在此范围之外,可以使用64位带符号的 Int64 类型,该类型的范围为 -9 223 372 036 854 775 808到9 223 372 036 854 775 807。

    代码清单2-12举例说明了PowerShell如何处理 Int32 类型。

    代码清单2-12 Int32 类型存储不同的值

    PS> $num = 1 ❶
    PS> $num
    1
    PS> $num.GetType().name ❷
    Int32
    PS> $num = 1.5 ❸
    PS> $num.GetType().name
    Double
    PS> [Int32]$num ❹
    2

    下面来一步一步地分析。先别担心句法,目前我们关注的是输出。首先,创建变量 $num ,并将值设为1❶。然后,检查 $num 的类型❷,发现PowerShell使用 Int32 类型表示1。接下来,修改 $num 的值,改成一个小数❸,再次检查类型,发现PowerShell将该变量的类型改成了 Double 。这是因为PowerShell会根据变量的值确定变量的类型。但可以强制PowerShell将变量视作某种类型,这叫 类型校正 。最后,在 $num 前面加上 [Int32] 句法❹,这就是类型校正。可以看到,如果强制将1.5视作整数,则PowerShell会将其四舍五入为2。

    接下来将介绍 Double 类型。

  2. 浮点数类型

    Double 是一种范围更广的变量类型,称作 浮点数 变量。浮点数也可用于表示整数,但最常用于表示小数。此外,浮点数变量的另一种类型是 Float 。本书不详述 Float Double 类型的内部表示,你只需要知道,虽然二者都可以表示小数,但精度不同,如代码清单2-13所示。

    代码清单2-13 浮点数类型的精度误差

    PS> $num = 0.1234567910
    PS> $num.GetType().name
    Double
    PS> $num + $num
    0.2469135782
    PS> [Float]$num + [Float]$num
    0.246913582086563

    可以看到,PowerShell默认使用 Double 类型。注意,将 $num 与自身相加,并将类型校正为 Float 后,结果有点儿奇怪。同样,这背后的原因超出了本书范畴。需要记住的是,使用 Float Double 会产生这样的误差。

前面已经见过这种类型的变量。在代码清单2-4中定义 $color 变量时,我们没有直接输入 $color = blue ,而是将值放在一对单引号中,以告诉PowerShell这是一系列字母,即 字符串 。如果不将 blue 放在一对引号中就赋值给 $color ,那么PowerShell会报错。

S> $color = blue
blue : The term 'blue' is not recognized as the name of a cmdlet, function, script file, or
operable program. Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.
At line:1 char:10
+ $color = blue
+          ~~~~
    + CategoryInfo          : ObjectNotFound: (blue:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

如果没有引号,那么PowerShell会将 blue 解释为一个命令,并尝试执行该命令。由于 blue 命令不存在,因此PowerShell会返回一个错误消息来说明原因。正确定义字符串的方法是在值两侧加上引号。

  1. 合并字符串和变量

    字符串不一定是单词,还可以是短语或句子。例如,可以将下列字符串赋值给 $sentence 变量。

    PS> $sentence = "Today, you learned that PowerShell loves the color blue"
    PS> $sentence
    Today, you learned that PowerShell loves the color blue

    有时我们想将这句话中的PowerShell和blue两个词当作变量的值。例如,有一个变量名为 $name ,另一个变量名为 $language ,还有一个变量名为 $color 。代码清单2-14使用其他变量定义了 $sentence 变量。

    代码清单2-14 在字符串中插入变量

    PS> $language = 'PowerShell'
    PS> $color = 'blue'
    
    PS> $sentence = "Today, you learned that $language loves the color $color"
    PS> $sentence
    Today, you learned that PowerShell loves the color blue

    注意,这里使用的是双引号。如果将句子放在单引号中,则得不到预期结果。

    PS> 'Today, $name learned that $language loves the color $color'
    Today, $name learned that $language loves the color $color

    这不是诡异的bug,而是因为PowerShell中的单引号和双引号有重要区别。

  2. 单引号与双引号

    将简单的字符串赋值给变量时,使用单引号或双引号都可以,如代码清单2-15所示。

    代码清单2-15 使用单引号和双引号来修改变量的值

    PS> $color = "yellow"
    PS> $color
    yellow
    PS> $color = 'red'
    PS> $color
    red
    PS> $color = ''
    PS> $color
    PS> $color = "blue"
    PS> $color
    blue

    可以看到,定义简单的字符串时,使用哪种引号无关紧要。那么为什么在字符串中有变量时却有区别呢?答案藏在 变量内插 (或称作 变量扩展 )机制中。通常来说,在控制台中输入 $color 后按回车键,PowerShell会 内插 (或 扩展 )变量。虽然这两个术语听起来很高深,但其实就是PowerShell将变量中的值读取出来,或者说打开盒子,让你看到里面的东西。在双引号中调用变量的原理是一样的:变量得到扩展,如代码清单2-16所示。

    代码清单2-16 字符串中的变量行为

    PS> "$color"
    blue
    PS> '$color'
    $color

    请注意使用单引号时的情况:控制台会输出变量自身,而不是它的值。在PowerShell看来,单引号意味着保持不变,输入什么就显示什么,不管是blue这样的词,还是 $color 这样看起来像是变量的内容。对PowerShell来说,二者是相同的,不会对单引号中的值做特殊处理。PowerShell不会将单引号中的变量扩展为变量的值。因此,在字符串中插入变量时,需要使用双引号。

    布尔值、整数和浮点数相关的知识还有很多,我们暂时停下脚步,介绍一下更为一般的概念:对象。 p8l/S4CSn3Xce40/qtiZBOV/yiWGvHH7EYZJ7Nhz18CMvjj9GUP6LXRERmhNXrp9

点击中间区域
呼出菜单
上一章
目录
下一章
×