关于数组:Powershell添加成员。 添加成员是ArrayList吗?

Powershell add-member. Add a member that's an ArrayList?

Powershell的" add-member"命令非常有用。我使用它向自定义对象添加属性。有时我将一个成员设置为一个数组,以容纳多个对象。是否可以将ArrayList作为成员添加到自定义对象上?

想象一下,具有属性"索引","标题"和"关键字"的文章列表。在Powershell中,您可以将此代码放入循环中:

1
2
3
4
5
6
7
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个对象,每个对象都有成员索引,标题和关键字。此外,关键字member是一个可以具有多个条目的数组:

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

这满足了我的大多数需求,但是我只是不喜欢处理数组。仅由于以下原因,ArrayList才更易于使用

1
$arrayList1.remove("value")

比这更直观

1
$array1 = $array1 |? {$_ new"value"}

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$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添加到自定义对象中,只需使用

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


我发现所有这些Add-Member的东西仅对数据造成混淆。 在powershell 3中,您可以仅从哈希表中创建一个对象,并使用从博客中学到的关于使用Invoke获取Collection类型的对象的一些知识:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$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