Windows PowerShell每周提示(3):访问数组中的值
且不论他们富有魅力的生活方式(例如,仅在过去的一年中脚本专家Jean Ross和Greg Stemp已经从Orlando,FL出发到过……呃,Orlando,FL),从内心上来说,脚本专家是一群有着简单品味的普通人。他们带着Windows PowerShell,例如,询问100个人他们最喜欢Windows PowerShell的什么,那么你将很有可能得到100种不同的回答,他们中的大多数人富有经验地处理诸如访问.NET Framework之类的新功能。如果询问脚本专家们中的任意一个,他们最喜欢Windows PowerShell的什么,那么你有可能得到一致的回答:PowerShell让你能以很酷的方式访问数组中的值。
如果你是VBScript脚本方面老手的话,你不得不带着害怕的感觉来面对数组。为什么?好的,其一,你不能回显任何数组的值;那将会导致“类型不匹配”错误。例如,看一下下面的VBScript脚本:
x = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Wscript.Echo x
这能够运行么?你已经知道这个问题的答案了,不是么?是的,它无法正常运行。取而代之的是,你需要建立For Each或者For Next 循环来获得x中的值:
x = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
For Each y in x
Wscript.Echo y
Next
那没有什么特别困难的,但是你确实需要对妳的脚本做一些额外的工作。此外,你有可能需要预先检查来确保x是以数组的形式第一次出现(这将导致更多一点的工作量)。毕竟,尝试循环不是数组的变量也将会导致错误:
x = 1
For Each y in x
Wscript.Echo y
Next
在这个例子中我们只能得到“对像不是一个集合”的信息。
而Windows PowerShell则完全不同。例如,考虑下下面的Windows PowerShell脚本:
$x = 1,2,3,4,5,6,7,8,9,10
$x
当我们运行这个脚本的时候将发生什么?这就是将要发生的:
1
2
3
4
5
6
7
8
9
10
换句话说,Windows PowerShell让你能够访问数组中的所有值只通过简单的回显数组它本身(本例中是$x)。你不必建立For each loop循环或者For Next循环;PowerShell为你处理这些事。
当然,在VBScript下你不必访问数组中的所有项目;你能通过指定项目索引号来访问单个项目。例如,假设你要访问以下数组中的第三个项目:
x = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
因为在VBScript(及PowerShell)中的数组是从0开始索引的,第二个项目的索引号为1,推而广之,第三个项目的索引号为2.我们如何访问第三个项目并只访问它?使用类似这样的代码:
Wscript.Echo x(2)
就如你期待的,Windows PowerShell让你能做同样的事,并且使用相似的语法;
$x[2]
但不仅仅是这样。想要回显数组中的最后一个项目?在VBScript中这是可以的,虽然使用一些令人看上去疯狂的结构:
Wscript.Echo x(Ubound(x))
这是你如何在Windows PowerShell中完成同样的任务:
$x[-1]
那是什么?那如何访问数组中倒数第二个项目呢?没有问题:
$x[-2]
等等……
但是等一下,还有更多的问题。假设你要回显索引号为1,3,5,7的项目值?无论相信与否,那没有什么问题。只要确保指定了那些索引号,并使用逗号分隔单独的数字:
$a[1,3,5,7]
我们直到最后都做得很好。Windows PowerShell提供了称为“数字范围”操作符(..)的特性,这使你能指定一个范围内的数字,这对你在处理数组时十分有帮助。假设我们有一个100个项目的数组,并且我们需要回显第37-39号项目的值。如果你愿意,我们可以单独列出每个项目的索引号。或者我们可以用数字范围操作符来替代:
$a[37..79]
很漂亮,不是么?如同在蛋糕里加入一点冰,范围操作符也并不局限于数组。例如,试试这个小巧的单行脚本并看看会发生什么:
1..100
也只有简单品味的普通人才能抑制不住被简单的事物所感动。
英文原文
http://www.microsoft.com/technet/scriptcenter/resources/pstips/jun07/pstip0622.mspx