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作为成员的新类吗?
答案 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