(12)Powershell中变量的类型
Window Powershell中变量的类型与Java,C#等高级语言中变量的类型不一样,可以不用显示指定Powershell中变量的类型,即Powershell中的变量具有更大的灵活性。Powershell中的变量采用 .Net Framework类型。
默认情况下,当变量只有一个值时,变量的数据类型由赋予变量的值决定。例如,下面的语句创建一个整数 (System.Int32) 类型的变量:
PS C:\Users\tiand> $a=3
如果需要确定变量的 .NET Framework 类型,可以使用 GetType() 方法(该方法没有任何参数)的 FullName 属性,例如:
PS C:\Users\tiand> $a=3
PS C:\Users\tiand> $a.GetType().fullname
System.Int32
创建字符串变量与Java,C#高级语言一致,需要把值放在引号内。例如:
PS C:\Users\tiand> $a = "3"
PS C:\Users\tiand> $a.GetType().fullname
System.String
如果赋予变量的第一个值是字符串,则 PowerShell 将所有运算都视为字符串运算(字符串的连接),并将新值转换为字符串。例如以下语句执行的结果34是字符串(可以获取其类型来验证):
PS C:\Users\tiand> $a = "3"
PS C:\Users\tiand> $a += 4
PS C:\Users\tiand> $a
34
Powershell中也可以强制指定变量的类型。
在变量名称之前放置类型名称或第一个所赋值前面的方括号中,可以将新的标量变量转换为任何 .NET Framework 支持的类型。在转换变量时,可以确定该变量所能存储的数据的类型。同时,还可以确定只有符合类型的变量才可以赋值给指定的变量。还可以确定填充变量时的变量行为方式。
例如,以下命令将变量转换为字符串类型。
PS C:\Users\tiand> [string]$a=30
PS C:\Users\tiand> $a += 5
PS C:\Users\tiand> $a
305
下面的语句转换第一个值,而不是转换变量:
PS C:\Users\tiand> $a = [string]30
将变量转换为特定类型时,通常的约定是转换变量而不是值。但是,如果现有变量的值不能转换为新数据类型,则不能重新转换该变量的数据类型。要更改数据类型,必须替换该变量的值(相当于创建新的变量),例如:
PS C:\Users\tiand> $b = "string"
PS C:\Users\tiand> [int]$b
値 "string" を型 "System.Int32" に変換できません。エラー: "入力文字列の形式が正しくありません。"
発生場所 行:1 文字:1
+ [int]$b
+ ~~~~~~~
+ CategoryInfo : InvalidArgument: (:) []、RuntimeException
+ FullyQualifiedErrorId : InvalidCastFromStringToInteger
PS C:\Users\tiand> [int]$b = 4
将数据类型放在变量名称的前面会锁定变量的类型,除非通过指定另一个数据类型显式覆盖该类型
如果试图赋予与现有类型不兼容的值,并且未显式覆盖该类型,则 Windows PowerShell 将显示错误,例如:
PS C:\Users\tiand> $a = 3
PS C:\Users\tiand> $a = "string"
PS C:\Users\tiand> [int]$a = 3
PS C:\Users\tiand> $a = "string"
値 "string" を型 "System.Int32" に変換できません。エラー: "入力文字列の形式が正しくありません。"
発生場所 行:1 文字:1
+ $a = "string"
+ ~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException
+ FullyQualifiedErrorId : RuntimeException
PS C:\Users\tiand> [string]$a = "string"
在 PowerShell 中,通过数组包含多个项的变量的数据类型的处理方式与包含单个项的变量的数据类型不同。除非明确向数组变量指定数据类型,否则其数据类型始终是 System.Object []。此数据类型是特定于数组的。也可以通过指定另一个类型来覆盖默认类型。例如,下面的语句将变量转换为 string [] 数组类型:
PS C:\Users\tiand> [string]$a = "string"
PS C:\Users\tiand> [string[]] $a = "one","two","three"
PowerShell 变量可以是任何 .NET Framework 数据类型。此外,也可以赋予在当前进程中可用的任何完全限定的 .NET Framework 数据类型。例如,下面的语句指定 System.DateTime 数据类型:
PS C:\Users\tiand> [system.datetime]$a = "4/1/2017"
PS C:\Users\tiand> $a
2017年4月1日 0:00:00
为多个变量赋值
PowerShell 中,可以使用单个命令对多个变量赋值。所赋值的第一个元素将赋予第一个变量,第二个元素赋予第二个变量,第三个元素赋予第三个变量,依此类推。例如,下面的命令将值 4 赋予 $a 变量,将值 5 赋予 $b 变量,并将值 6 赋予 $c 变量:
PS C:\Users\tiand> $d,$e,$f = 4,5,6
PS C:\Users\tiand> $d
4
PS C:\Users\tiand> $e
5
PS C:\Users\tiand> $f
6
如果所赋值包含的元素个数超过变量个数,则将所有剩余的值都赋予最后一个变量。例如,下面的语句包含三个变量和五个值:
PS C:\Users\tiand> $d,$b,$c = 4,5,6,7,8
PS C:\Users\tiand> $d
4
PS C:\Users\tiand> $b
5
PS C:\Users\tiand> $c
6
7
8
PS C:\Users\tiand> $c.GetType().fullname
System.Object[]
注意最后一个变量的类型是System.Object[]。
PS C:\Users\tiand> $a,$b,$c = 4,5,6,7,8
PS C:\Users\tiand> $g,$e,$f = $c
PS C:\Users\tiand> $g
6
PS C:\Users\tiand> $e
7
PS C:\Users\tiand> $f
8
上面的命令将值 6 赋予 $d 变量,将值 7 赋予 $e 变量,并将值 8 赋予 $f 变量。
通过串联变量,还可以将单个值赋予多个变量。例如,以下以下语句将值"string"赋予所有四个变量:
PS C:\Users\tiand> $b = $c = $d = 9
PS C:\Users\tiand> $b
9
PS C:\Users\tiand> $c
9
PS C:\Users\tiand> $d
9
总结
本节介绍了Powershell中变量的类型,通过本节的学习应当掌握以下内容
-
根据变量的值可以判断变量的类型,可以通过变量的GetType()方法的fullname属性。
-
Powershell变量类型不同,进行的运算也不同(如是数字值的相加还是字符串的连接)。
-
给多个变量赋值或是把一个值赋值给多个变量(变量的串联)。