Powershell添加成员。添加一个ArrayList的成员?

时间:2014-07-23 20:28:24

标签: arrays powershell

Powershell“add-member”命令非常有用。我用它来为自定义对象添加属性。有时我将一个成员设置为一个数组来保存多个对象。是否可以在自定义对象上添加ArrayList作为成员?

想象一下文章列表中包含属性“index”,“title”和“keywords”。在Powershell中,您可以将此代码放在循环中:

for($i = 0; $i -lt 100; $i++) {
    $a = new-object -TypeName PSObject
    $a | Add-Member -MemberType NoteProperty -Name index -Value $i
    $a | Add-Member -MemberType NoteProperty -Name title -Value "Article $i"
    $a | Add-Member -MemberType NoteProperty -Name keywords -Value @()
    $articles += $a
}

你最终会得到一个Article对象的数组文章,每个对象都包含成员索引,标题和关键字。此外,关键字成员是一个可以有多个条目的数组:

$articles[2].keywords += "Stack Exchange", "Powershell", "ArrayLists"
$articles[2].keywords[2]
Powershell

这满足了我的大多数需求,但我不喜欢处理数组。如果只是因为

,ArrayLists更容易使用
$arrayList1.remove("value")

更直观
$array1 = $array1 |? {$_ new "value"}

Add-Member是否有办法将ArrayList添加为成员?还是我坚持阵列?如果Powershell不支持,我可以使用一些C#代码来创建一个以ArrayList作为成员的新类吗?

2 个答案:

答案 0 :(得分:8)

$arr = @("one","two","three")
$arr.GetType()

IsPublic IsSerial Name                                     BaseType                                                                                       
-------- -------- ----                                     --------                                                                                       
True     True     Object[]                                 System.Array   

$a = new-object -TypeName PSObject 
[System.Collections.ArrayList]$arrList=$arr
$a | Add-Member -MemberType NoteProperty -Name ArrayList -value $arrlist

$a.ArrayList

one
two
three

$a.ArrayList.remove("one")
$a.ArrayList

two
three

要将空白ArrayList添加到自定义对象,只需使用

$a | Add-Member -MemberType NoteProperty -Name ArrayList -value (New-object System.Collections.Arraylist)

答案 1 :(得分:3)

我发现所有这些Add-Member的东西只会让数据混乱。在powershell 3中,你可以从哈希表中创建一个对象,并使用我从blog学到的关于使用Invoke获取Collection类型对象的一些东西:

$myObject = [PSCustomObject]@{
        index = $idx;
        title = $title;
        keywords = {@()}.Invoke()
    }

$myObject.keywords.Add("foo")
$myObject.keywords.Add("bar")

Write-Host "Original"
$myObject.keywords
Write-Host

Write-Host "New:"
[void]$myObject.keywords.Remove("foo")
$myObject.keywords
Write-Host

Original
foo
bar

New:
bar