【Powershell】在 PowerShell 数组中添加和删除项

时间:2024-01-23 21:19:35

在 PowerShell 数组中添加和删除项是一个可能会导致一些意外的报错,这里我把可用的办法总结一下。

问题:

创建一个数组,我们将记下 System.Array 类型:

$Fruits = "Apple","Pear","Banana","Orange"
$Fruits.GetType()

但是,如果我们尝试向数组添加或删除项目,则会出现“集合大小固定”的错误

$Fruits.Add("Kiwi")
$Fruits.Remove("Apple")
$Fruits.IsFixedSize


【Powershell】在 PowerShell 数组中添加和删除项_数组

我们可以看到,我们最初创建的数组是固定大小的。ISFixedSize 属性的 MSDN 页有助于解释这一点。请注意,它支持修改现有元素,但不支持添加或删除其他元素。


【Powershell】在 PowerShell 数组中添加和删除项_fixed_02

问题原因已经很清楚了,那么如何实现修改的目的呢?

方法1

解决此问题的一种方法是改用 System.Collections.ArrayList

[System.Collections.ArrayList]$ArrayList = $Fruits
$ArrayList.GetType()
$ArrayList.IsFixedSize

【Powershell】在 PowerShell 数组中添加和删除项_数组_03

现在,如果我们尝试前面的添加和删除方法,我们就成功了:

$ArrayList.Add("Kiwi")
$ArrayList
$ArrayList.Remove("Apple") 
$ArrayList

【Powershell】在 PowerShell 数组中添加和删除项_error_04

方法2

另外,如果我们坚持使用原来的数组对象,也可以用下面的方法向其中 "add"一个项目。(这将创建一个包含额外项的新数组)

$Fruits = "Apple","Pear","Banana","Orange"
$Fruits.IsFixedSize
$New = $Fruits += "Kiwi"
$New
$Fruits
$New.GetType()
$New.IsFixedSize

【Powershell】在 PowerShell 数组中添加和删除项_fixed_05

上面只是为了说明原理,实际代码时这样做才是更加合理的

$Fruits = "Apple","Pear","Banana","Orange"
$Fruits.IsFixedSize
$Fruits = $Fruits += "Kiwi"
$Fruits
$Fruits.GetType()
$Fruits.IsFixedSize

【Powershell】在 PowerShell 数组中添加和删除项_error_06

方法3

将初始数组转换成 System.Collections.ObjectModel.Collection这样的名字优点太长了,下面这个方法可能比使用集合或数组列表的完整类型名称更容易记忆:

$Fruits = "Apple","Pear","Banana","Orange"
$Fruits.IsFixedSize
$Fruits = {$Fruits}.Invoke()
$Fruits
$Fruits.GetType()
$Fruits.IsFixedSize

【Powershell】在 PowerShell 数组中添加和删除项_powershell_07

现在,我们可以使用添加和删除方法添加和删除项目:

$Fruits.Add("Melon")
$Fruits
$Fruits.Remove("Apple")
$Fruits

【Powershell】在 PowerShell 数组中添加和删除项_error_08

OK,这个问题就到这里吧,如果有朋友有更好的办法,欢迎留言区分享哈!!