在 PowerShell 数组中添加和删除项是一个可能会导致一些意外的报错,这里我把可用的办法总结一下。
问题:
创建一个数组,我们将记下 System.Array 类型:
$Fruits = "Apple","Pear","Banana","Orange"
$Fruits.GetType()
但是,如果我们尝试向数组添加或删除项目,则会出现“集合大小固定”的错误
$Fruits.Add("Kiwi")
$Fruits.Remove("Apple")
$Fruits.IsFixedSize
我们可以看到,我们最初创建的数组是固定大小的。ISFixedSize
属性的 MSDN 页有助于解释这一点。请注意,它支持修改现有元素,但不支持添加或删除其他元素。
问题原因已经很清楚了,那么如何实现修改的目的呢?
方法1
解决此问题的一种方法是改用 System.Collections.ArrayList
[System.Collections.ArrayList]$ArrayList = $Fruits
$ArrayList.GetType()
$ArrayList.IsFixedSize
现在,如果我们尝试前面的添加和删除方法,我们就成功了:
$ArrayList.Add("Kiwi")
$ArrayList
$ArrayList.Remove("Apple")
$ArrayList
方法2
另外,如果我们坚持使用原来的数组对象,也可以用下面的方法向其中 "add"
一个项目。(这将创建一个包含额外项的新数组)
$Fruits = "Apple","Pear","Banana","Orange"
$Fruits.IsFixedSize
$New = $Fruits += "Kiwi"
$New
$Fruits
$New.GetType()
$New.IsFixedSize
上面只是为了说明原理,实际代码时这样做才是更加合理的
$Fruits = "Apple","Pear","Banana","Orange"
$Fruits.IsFixedSize
$Fruits = $Fruits += "Kiwi"
$Fruits
$Fruits.GetType()
$Fruits.IsFixedSize
方法3
将初始数组转换成 System.Collections.ObjectModel.Collection
这样的名字优点太长了,下面这个方法可能比使用集合或数组列表的完整类型名称更容易记忆:
$Fruits = "Apple","Pear","Banana","Orange"
$Fruits.IsFixedSize
$Fruits = {$Fruits}.Invoke()
$Fruits
$Fruits.GetType()
$Fruits.IsFixedSize
现在,我们可以使用添加和删除方法添加和删除项目:
$Fruits.Add("Melon")
$Fruits
$Fruits.Remove("Apple")
$Fruits
OK,这个问题就到这里吧,如果有朋友有更好的办法,欢迎留言区分享哈!!