[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[转载教程] [PowerShell教程][09]PowerShell中的数组使用

[PowerShell教程][01]初识PowerShellhttp://bbs.bathome.net/thread-12415-1-1.html
[PowerShell教程][02]PowerShell基础知识之一http://bbs.bathome.net/thread-12416-1-1.html
[PowerShell教程][03]PowerShell数据类型之整型http://bbs.bathome.net/thread-12417-1-1.html
[PowerShell教程][04]PowerShell面向对象基础之一http://bbs.bathome.net/thread-12418-1-1.html
[PowerShell教程][05]PowerShell面向对象基础之二http://bbs.bathome.net/thread-12419-1-1.html
[PowerShell教程][06]PowerShell中格式化命令和输出命令http://bbs.bathome.net/thread-12420-1-1.html
[PowerShell教程][07]PowerShell中Write族cmdlet的介绍和使用http://bbs.bathome.net/thread-12421-1-1.html
[PowerShell教程][08]字符串字面值http://bbs.bathome.net/thread-12422-1-1.html
[PowerShell教程][09]PowerShell中的数组使用http://bbs.bathome.net/thread-12423-1-1.html
[PowerShell教程][10]PowerShell中的HashTable的使用http://bbs.bathome.net/thread-12424-1-1.html
[PowerShell教程][11]PowerShell中的加法运算http://bbs.bathome.net/thread-12425-1-1.html

说明:教程转自 http://bbs.winos.cn/thread-35543-1-1.html


作者: Edengundam(马涛)


在日常处理中,除了使用像“数值类型”和“字符串类型”外,还需要使用能够包含其他对象的“集合”类型(请注意,这里的集合对应英文是Collection,而非数学概念上的Set)。大多数常见语言,都提供一些操作集合类型的语法。最基本的集合类型就是数组类型,它提供了一种下标基于0的数组对象。
首先通过几个简单的例子,来了解一下PowerShell中的数组是如何使用的。
  1. PS C:\> 1,'a',2MB,0x100
  2. 1
  3. a
  4. 2097152
  5. 256
复制代码
上面的小例子输出了4个对象:数值“1”、字符串“a”(注意:虽然只有一个字符,但这里仍然是一个字符串)、数值“2MB”和十六进制数值“0x100”。也许您很想了解这个例子和数组究竟有什么联系,实际上这个例子清楚地解释了PowerShell中数组类型的语法。在PowerShell中,只要把不同的对象用逗号“,”连接起来,就可以构造出数组对象。本章节的重点在于像大家介绍数组类型的使用,因此将在后续的章节详细介绍逗号表达式“,”的使用。我们回到刚才的例子中,虽然这4个对象组成了PowerShell中的数组对象,但是如果没有把这个对象存储起来或者丢弃掉的话,PowerShell就会利用默认的格式器和输出器将它们输出到控制台上。最终我们就看到了上面四行输出结果。
现在我们知道了PowerShell中构造数组的最简单的方式,接下来让我们一起探索更多关于数组对象更多的特性:
  1. PS C:\> $array1 = 1,2,3,4
  2. PS C:\> $int = 1
  3. PS C:\> $array1.count
  4. 4
  5. PS C:\> "$array1"
  6. 1 2 3 4
  7. PS C:\> $int.count
  8. PS C:\> "$int"
  9. 1
复制代码
细心的读者肯定已经发现,在第一个例子中,使用了逗号构造了一个包含四个整数的数组,并将其存储在变量$array1中。接下来将数值1存储在变量$int中。数组对象上有一个属性Count用来指出当前数组中的对象数量,我们可以看到$array1中包含了4个对象。但是在$int上确没有该属性(注意:如果引用的属性不存在,PowerShell返回$null对象,该对象不会对控制台产生任何影响,只是简单的使提示用户继续输入命令)。
PowerShell是基于对象的shell,现在让我们来看看数组究竟是什么对象:
  1. PS C:\> $array1.GetType().FullName
  2. System.Object[]
复制代码
在PowerShell中调用对象上的GetType()方法,可以得到该对象的类型对象(类型也是一个对象)。而该对象上的FullName属性就是该对象表示的类型的名称。这里有点绕口令了,总之如果你想知道一个对象的类型就调用GetType()方法,再访问FullName属性就可以了。

学会了创建数组以及知道了数组包含的对象数量,现在来学习一下如何访问数组中的元素。实际上PowerShell的数组其实通过.Net类库中的数组来实现的,也就是说PowerShell在.Net类库原有的实现上,增加了一些PowerShell便捷的访问接口,而实际操作的对象还是.Net类库中的对象。使用数组时,需要大家记住数组的第一个元素的下标是“0”、数组的最后一个元素下标是数组长度减去1。例如:
  1. PS C:\> $array
  2. = 1,2,3
  3. PS C:\> $array.Length
  4. 3
  5. PS C:\> $array[0]
  6. 1
  7. PS C:\> $array[2]
  8. 3
  9. PS C:\> $array[4]
  10. PS C:\>
复制代码
实际上,Count是属性Length的别名,这主要是为不同对象提供一致性接口的技术。这里需要特别注意的是,当数组访问越界时,PowerShell是不会给出任何错误信息的,只会得到一个$null对象。
如果我们已经有一个数组了,应该如何向这个数组中添加新的元素呢?在Perl中,你只需简单的使用你想使用的索引,然后存储上你想存储的数值就完成了任务。然而在PowerShell中,如果你使用类似的方法就会得到如下的结果:
  1. PS C:\> $a="My ThinkPad", "My PC"
  2. PS C:\> $a[0]
  3. My ThinkPad
  4. PS C:\> $a[1]
  5. My PC
  6. PS C:\> $a[2] = "My Mac"
  7. 数组赋值失败,因为索引“2”超出范围。
  8. 所在位置 行:1 字符: 4
  9. + $a[2 <<<< ] = "My Mac"
复制代码
PowerShell的错误信息指出:索引越界。解决这个的办法其实很简单,只要使用下面的代码就可以巧妙解决:
  1. PS C:\> $a=$a+"My Mac"
  2. PS C:\> $a
  3. My ThinkPad
  4. My PC
  5. My Mac
  6. PS C:\> $a[2]
  7. My Mac
复制代码
在PowerShell中,数组其实是一个大小固定的数据结构,如果需要向数组中添加更多的对象时,就必须使用加号“+”运算符。在执行“+”操作的过程中,PowerShell实际上进行了下述操作:
1)
首先创建一个新的数组,该数组的大小能够存下运算结果的所有对象;
2)
将第一个数组的成员拷贝到新数组中;
3)
将第二个数组的成员拷贝到新数组中。
通过观察这个操作过程,很容易发现:如果数组中包含元素很多,而且频繁的向数组添加对象,一定会使PowerShell执行脚本时更慢。因此,我们需要谨记:大多数时候,数组是PowerShell中的便捷的工具,但是应该避免频繁地对其进行添加操作。在.Net类库中提供了其他的数据结构来满足需要经常向数组中添加对象的需求。

数组是powershell最常用的功能之一。这里我补充如下。

1 数组,确切地说应该叫对象组。一个数组,是一个对象,而这个对象中包含的,也都是对象。
如数组a中含有字符串bbb,数字123,那么bbb是对象,a是对象,123也是对象。
这三个对象,有各自的方法。
什么对象呢?答。net对象
什么方法呢?答。net方法。
帮助在哪呢?答msdn,
最好找。net 4.5的中文帮助。
http://msdn.microsoft.com/zh-cn/library/system.string(v=vs.110).aspx
这个网址是。net4.5中文 字符串的类。
因为powershell是。net的封装。你玩powershell实际上是在调用。net


2 对象组中,可以包含(另一个)对象组。可以包含哈希表 对象。可以包含任何其他对象。如字符串,和数字。
并【不!】是,一个数组中只能包含【种类相同的对象】。

3 把数组比喻成贪吃蛇的话。如果这条蛇想增加身体的长度,缩减身体的长度,应该用动态数组。
http://msdn.microsoft.com/zh-cn/ ... llections.arraylist(v=vs.110).aspx


够简单明了么?
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

返回列表