欢迎光临 Enjoy IT (ITECN.NET) 登录 | 注册 | 帮助

Windows PowerShell每周提示(14):从数组中移除项目

当编写系统管理脚本时数组毫无疑问是非常有用的。同样在Windows PowerShell中使用数组也比较简单的,这一点也基本没什么疑问(假设和无疑相比你可以有点怀疑);为此,我们已经在几周前的“每周提示”中谈论了针对数组你可以使用的几个不同的技巧。不过内建在Windows PowerShell中的数组至少有一个弱点:添加新项目进数组也许很容易,但是没有相对简单的方法从一个数组中移除已存在项目。这很可惜,但是这就是既成事实的事,没什么办法。毕竟你不得不使用现在内建于Windows PowerShell的数组,不是么?

使用.NET Framework ArrayList

你已经得出我们问题的答案了,是么?你不得不使用内建在Windows PowerShell内的数组?当然不。毕竟Windows PowerShell提供了完整的对.NET Framework的访问,而.NET Framework提供所有可选择的数组,集合及哈希表的组合。不喜欢内建在Windows PowerShell的数组类?那么使用一个不同的数组类吧。

好问题:哪一个不同的数组类型我们能使用?好的,值得研究的一个数组类型是System.Collections.ArrayList类。为了使用这个数组类型,我们所要做的是使用New-Object来创建新的ArrayList类的实例,一个我们命名为$a的实例:

$a = New-Object System.Collections.ArrayList

这个命令给了我们一个名为$a的空数组。如果我们想要向数组内添加一些信息(这是我们有可能做的),我们所要做的是调用Add然后跟上我们想要添加进数组的项目。例如,下面有一系列的命令将六种不同的颜色添加进我们的数组:

$a.Add("red")

$a.Add("yellow")

$a.Add("orange")

$a.Add("green")

$a.Add("blue")

$a.Add("purple")

如果我们现在回显$a的值,我们会得到以下输出:

red

yellow

orange

green

blue

purple

很酷不是么?哦,我们知道了。你看上去没有被打动,也许这是因为,离我们的主题太远了,我们还没有真正的开始处理我们的问题。但是不要担心,我们正要改变现状。

首先,让我们看看我们是否能从数组中移除指定项。如果是标准的PowerShell数组类这是困难的提议。正如在Windows PowerShell帮助文档中说明的:

从数组中删除元素不是那么容易,你能创建包含从已存在数组选择出的元素的新数组。例如,使用$a数组中除了索引号为2外的其它所有元素创建新的$t数组,输入:

$t = $a[0,1 + 3..($a.length - 1)]

诚然,这能运行。在另一方面,这也不是特别直观,这依赖于你对你想要移除的项目的索引号的熟悉程度;你不能简单说:“嗨,$a,你能帮我移除yellow么?”但是,当你使用ArrayList类的时候你所要做的就是:

$a.Remove("yellow")

如你所见,这也许是你用过的最简单的命令了:你要做的是调用Remove方法,附上要移除的项目作为方法的参数。现在看下$a的值,注意到任何消失的东西没?

red

orange

green

blue

purple

对:yellow被移除了,我们除了调用Remove方法之外不用再做更复杂的事了。很酷吧。

有另外一种方法能快速简单的从数组中移除多个项目(是的,我们说是多个项目)。假设我们有我们的原始数组,即有六种不同颜色的数组。为了某些原因,我们决定保留开始的三种颜色(redyelloworange)并删除余下的三个。我们怎么做呢?像这样:

$a.RemoveRange(3,3)

我们在这里所做的是调用RemoveRange方法,该方法让我们能从ArrayList中删除一个范围内的项目。注意我们向RemveRange传递了一对参数,在本例中是一对3。第一个三代表第一个被移除的项目的索引号。像大多数数组一样,在ArrayList中第一个项目的索引号是0;这意味着第二个项目的索引号是1,第三个项目的索引号是2。这和我们有关么?一定是这样的;毕竟,这意味这第四个项目(第一个被移除的项目)的索引号为3。于是第一个3,告诉RemoveRange我们想要移除的第一个项目的索引号是3(数组中的四个项目)

那么第二个三代表什么?这很简单:代表我们想要移除的项目数。假设我们只想要移除项目45,保留6。在本例中,我们使用这个命令:

$a.RemoveRange(3,2)

这将使得$a等于:

red

orange

yellow

purple

顺便说一句,你能通过回显Count属性的值决定数组中项目数量,像这样:

$a.Count

噢,还有一件事:如果你想删除数组中所有项目?这里还有个办法,调用Clear方法:

$a.Clear()

这只是.NET Framework中众多可选的数组,集合及哈希表中的一个。下周我们将讨论另一个可选的:哈希表。

英文原文

http://www.microsoft.com/technet/scriptcenter/resources/pstips/sept07/pstip0907.mspx

已发表 2007年11月1日 14:25 作者 ghjconan

评论

禁止匿名发表评论