Powershell"add-member"命令非常有用.我用它来为自定义对象添加属性.有时我将一个成员设置为一个数组来保存多个对象.是否可以在自定义对象上添加ArrayList作为成员?
想象一下,文章列表中包含"索引","标题"和"关键字"属性.在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
}
Run Code Online (Sandbox Code Playgroud)
你最终会得到一个Article对象的数组文章,每个对象都包含成员索引,标题和关键字.此外,关键字成员是一个可以有多个条目的数组:
$articles[2].keywords += "Stack Exchange", "Powershell", "ArrayLists"
$articles[2].keywords[2]
Powershell
Run Code Online (Sandbox Code Playgroud)
这满足了我的大部分需求,但我不喜欢处理数组.如果只是因为,ArrayLists更容易使用
$arrayList1.remove("value")
Run Code Online (Sandbox Code Playgroud)
比直觉更直观
$array1 = $array1 |? {$_ new "value"}
Run Code Online (Sandbox Code Playgroud)
Add-Member是否有办法将ArrayList添加为成员?还是我坚持阵列?如果Powershell不支持,那么我可以使用一些C#代码来创建一个以ArrayList为成员的新类吗?
$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
Run Code Online (Sandbox Code Playgroud)
要将空白ArrayList添加到自定义对象,只需使用
$a | Add-Member -MemberType NoteProperty -Name ArrayList -value (New-object System.Collections.Arraylist)
Run Code Online (Sandbox Code Playgroud)
我发现所有这些添加成员的东西仅对数据来说令人困惑。在 powershell 3 中,您可以从哈希表创建一个对象,并使用我从博客中学到的关于使用 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
Run Code Online (Sandbox Code Playgroud)