全部博文(74)
分类: WINDOWS
2008-07-30 23:53:21
在日常处理中,除了使用像“数值类型”和“字符串类型”外,还需要使用能够包含其他对象的“集合”类型(请注意,这里的集合对应英文是Collection,而非数学概念上的Set。)。大多数常见语言,都提供一些操作集合类型的语法。最基本的集合类型就是数组类型,它提供了一种下标基于0的数组对象。
首先通过几个简单的例子,来了解一下PowerShell中的数组是如何使用的。
PS C:\> 1,'a',2MB,0x100
1
a
2097152
256
上面的小例子输出了4个对象:数值“1”、字符串“a”(注意:虽然只有一个字符,但这里仍然是一个字符串)、数值“2MB”和十六进制数值“0x100”。也许您很想了解这个例子和数组究竟有什么联系,实际上这个例子清楚地解释了PowerShell中数组类型的语法。在PowerShell中,只要把不同的对象用逗号“,”连接起来,就可以构造出数组对象。本章节的重点在于像大家介绍数组类型的使用,因此将在后续的章节详细介绍逗号表达式“,”的使用。我们回到刚才的例子中,虽然这4个对象组成了PowerShell中的数组对象,但是如果没有把这个对象存储起来或者丢弃掉的话,PowerShell就会利用默认的格式器和输出器将它们输出到控制台上。最终我们就看到了上面四行输出结果。
现在我们知道了PowerShell中构造数组的最简单的方式,接下来让我们一起探索更多关于数组对象更多的特性:
PS C:\> $array1 = 1,2,3,4
PS C:\> $int = 1
PS C:\> $array1.count
4
PS C:\> "$array1"
1 2 3 4
PS C:\> $int.count
PS C:\> "$int"
1
细心的读者肯定已经发现,在第一个例子中,使用了逗号构造了一个包含四个整数的数组,并将其存储在变量$array1中。接下来将数值1存储在变量$int中。数组对象上有一个属性Count用来指出当前数组中的对象数量,我们可以看到$array1中包含了4个对象。但是在$int上确没有该属性(注意:如果引用的属性不存在,PowerShell返回$null对象,该对象不会对控制台产生任何影响,只是简单的使提示用户继续输入命令)。
PowerShell是基于对象的shell,现在让我们来看看数组究竟是什么对象:
PS C:\> $array1.GetType().FullName
System.Object[]
在PowerShell中调用对象上的GetType()方法,可以得到该对象的类型对象(类型也是一个对象)。而该对象上的FullName属性就是该对象表示的类型的名称。这里有点绕口令了,总之如果你想知道一个对象的类型就调用GetType()方法,再访问FullName属性就可以了。
学会了创建数组以及知道了数组包含的对象数量,现在来学习一下如何访问数组中的元素。实际上PowerShell的数组其实通过.Net类库中的数组来实现的,也就是说PowerShell在.Net类库原有的实现上,增加了一些PowerShell便捷的访问接口,而实际操作的对象还是.Net类库中的对象。使用数组时,需要大家记住数组的第一个元素的下标是“0”、数组的最后一个元素下标是数组长度减去1。例如:
PS C:\> $array = 1,2,3
PS C:\> $array.Length
3
PS C:\> $array[0]
1
PS C:\> $array[2]
3
PS C:\> $array[4]
PS C:\>
实际上,Count是属性Length的别名,这主要是为不同对象提供一致性接口的技术。这里需要特别注意的是,当数组访问越界时,PowerShell是不会给出任何错误信息的,只会得到一个$null对象。
如果我们已经有一个数组了,应该如何向这个数组中添加新的元素呢?在Perl中,你只需简单的使用你想使用的索引,然后存储上你想存储的数值就完成了任务。然而在PowerShell中,如果你使用类似的方法就会得到如下的结果:
PS C:\> $a = "My ThinkPad", "My PC"
PS C:\> $a[0]
My ThinkPad
PS C:\> $a[1]
My PC
PS C:\> $a[2] = "My Mac"
数组赋值失败,因为索引“2”超出范围。
所在位置 行:1 字符: 4
+ $a[2 <<<< ] = "My Mac"
PowerShell的错误信息指出:索引越界。解决这个的办法其实很简单,只要使用下面的代码就可以巧妙解决:
PS C:\> $a = $a + "My Mac"
PS C:\> $a
My ThinkPad
My PC
My Mac
PS C:\> $a[2]
My Mac
在PowerShell中,数组其实是一个大小固定的数据结构,如果需要向数组中添加更多的对象时,就必须使用加号“+”运算符。在执行“+”操作的过程中,PowerShell实际上进行了下述操作:
1) 首先创建一个新的数组,该数组的大小能够存下运算结果的所有对象;
2) 将第一个数组的成员拷贝到新数组中;
3) 将第二个数组的成员拷贝到新数组中。
通过观察这个操作过程,很容易发现:如果数组中包含元素很多,而且频繁的向数组添加对象,一定会使PowerShell执行脚本时更慢。因此,我们需要谨记:大多数时候,数组是PowerShell中的便捷的工具,但是应该避免频繁地对其进行添加操作。在.Net类库中提供了其他的数据结构来满足需要经常向数组中添加对象的需求。