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 |
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 |