我觉得我的德尔福背景正在破坏我解决这个问题的能力。我正在尝试在Powershell中创建一个空数组(没有数据,只是结构),其中每个项目都有两个属性。最终结果看起来像这样:
$WIP[0].signature = 'data'
$WIP[0].PID = 'data'
# other fake stuff in between
Write-host "Item 43 has signature: " $WIP[43].signature
出于某种原因,我试图创造应该简单易行的每一次尝试。想法?
我知道有些人会做与以下类似的事情,但这并不像我想的那样灵活:
$array = @()
$object = New-Object -TypeName PSObject
$object | Add-Member -Name 'Name' -MemberType Noteproperty -Value 'Joe'
$object | Add-Member -Name 'Age' -MemberType Noteproperty -Value 32
$object | Add-Member -Name 'Info' -MemberType Noteproperty -Value 'something about him'
$array += $object
这需要在创建每个$对象时为所有三个成员提供值。我认为init看起来更像是(伪代码):
$MyRecord = {
Signature as string
PID as integer
}
$RecArray = array of $MyRecord
这显然是Delphi和Powershell的糟糕混搭。但是会创建一个完整结构化的数组,如上所述可以寻址。
答案 0 :(得分:4)
PSv5 + 解决方案,使用 PS 类 和通用列表([System.Collections.Generic.List[]]
)存储实例(松散地说,一个可以有效增长的数组)。
# Your custom type.
class MyRecord {
[string] $Signature
[int] $PID
}
# If you want a list that can grow efficiently,
# use [System.Collections.Generic.List[]]
$RecList = [System.Collections.Generic.List[MyRecord]]::new()
# Add a new instance...
$RecList.Add([MyRecord]::new())
# ... and initialize it.
$RecList[0].Signature = 'sig1'
$RecList[0].Pid = 666
# ... or initialize it first, and then add it.
# Note the use of a cast from a hashtable with the property values.
$newRec = [MyRecord] @{ Signature = 'sig2'; PID = 667}
$RecList.Add($newRec)
# Output the list
$RecList
以上产量:
Signature PID
--------- ---
sig1 666
sig2 667
至于从列表中删除对象:
要通过 index 删除,请使用.RemoveAt()
;超出范围的索引会抛出错误:
$RecList.RemoveAt(1)
要通过已存储在列表中的对象删除,请使用.Remove()
。
请注意,[bool]
返回值表示值是否为
实际上已删除(如果对象不在列表中,则操作为
无操作且返回$False
)
$actuallyRemoved = $RecList.Remove($newRec)
有关详细信息,请参阅the docs。
答案 1 :(得分:0)
您想要创建自定义对象。
您创建的对象具有您需要的所有属性。然后创建一个集合,并将新对象的实例填充到集合中。这是一个例子:
$WIP = @()
$o = New-Object –TypeName PSObject
Add-Member -InputObject $o –MemberType NoteProperty –Name signature –Value 'foo'
Add-Member -InputObject $o –MemberType NoteProperty –Name data –Value 'bar'
$WIP += $o
$WIP[0].signature
$WIP[0].data
您需要为您正在创建的每个对象执行New-Object和Add-Member语句。
答案 2 :(得分:0)
所以这里有一个工作示例,说明如何使这样的工作:
$list=@()
1..100|foreach-object{
$obj=""|select signature,pid
$obj.signature="$_ signature"
$obj.pid="$_ PID"
$list+=$obj
}
以这种方式创建对象 - 您可以执行$list[43].signature
并且它确实有效。
答案 3 :(得分:0)
您可以使用带有索引的哈希表作为键,并将哈希表用作值。这很容易使用。
$WIP = @{
0 = @{
signature = 'signature 0'
PID = 'PID 0'
}
1 = @{
signature = 'signature 1'
PID = 'PID 1'
}
}
您可以添加所需的任何索引。
$WIP[12] = @{
signature = "signature 12"
PID = "PID 12"
}
$WIP[12].PID
# PID 12
您可以初始化both,any或none。
$WIP[76] = @{
signature = "signature 76"
}
$WIP[76].signature
# signature 76
$WIP[76].PID
# $null
Count为您提供“活动”元素的数量。
$WIP.Count
# 4
答案 4 :(得分:0)
“动态”究竟是什么意思?
$array = @(
# Some type of loop to create multiple items foreach/for/while/dowhile
foreach ($item in $collection) {
New-Object psobject -Property @{
Signature = 'data'
PID = 'data'
}
}
)
或者你可以手动添加这样的对象
$array = @()
# Later in code
$array += New-object psobject @{
Signature = 'data'
PID = 'data'
}
然后您可以像这样访问每个项目:
$array[1].Signature
$array[1].PID
答案 5 :(得分:0)
这与你已经展示的内容没有什么区别,但我认为这可以为你提供所要求的东西(即使它不是以强大的方式做事)。
a b
<chr> <chr>
1 var_imp_01 prevalence
2 var_imp_MeanDecreaseGini variance_pairwise_distance
3 var_imp_06 extinction_rate