如何将自定义属性添加到PowerShell阵列?
假设我有一个PowerShell数组$Sessions = @()
,我将填写PSCustomObjects。我怎样才能将自定义属性添加到数组本身?例如。所以我可以有$Sessions.Count
这是内置和$Sessions.Active
我想设置为活动会话计数。如何将自定义属性添加到PowerShell阵列?
我知道,我可以
$MyCustomObject = "" | Select-Object Machine, UserName, SessionTime
属性添加到PSCustomObjects(在一个肮脏的方式),但尽管这样做的阵列上不会导致财产被添加。
那么我该如何实现我的目标?有什么办法来创建自定义数组?
你所说的问题的答案如上所述将只在数组对象上使用Add-Member
。
Add-Member -InputObject $sessions -MemberType NoteProperty -Name "State" -Value "Fabulous"
添加属性的每个元素创建的对象类似于后。
$sessions | ForEach-Object{
$_ | Add-Member -MemberType NoteProperty -Name "State" -Value "Fabulous"
}
这当然带有警告(我忘记了)。从注释
但是,请注意,附加到该数组($ sessions + = ...)将替换数组,从而删除附加属性。
根据您的使用情况下,有其他的选择,让你想你想要的。您可以保存数组元素为不同的变量:
# Check the current object state
$state = $object.Property .....
# Add to the appropriate array.
if($state -eq "Active"){
$activeSessions += $object
} else {
$inactiveSessions += $object
}
或者你仍然可以根据需要您的国家财产和后处理与Where-Object
存储:
# Process each inactive session
$sessions | Where-Object{$_.State -eq "Active"} | ForEach-Object{}
为了避免破坏/重建阵列的问题,这可是一个性能猪,你也可以使用数组列表来代替。
$myArray = New-Object System.Collections.ArrayList
Add-Member -InputObject $myArray -MemberType ScriptMethod -Name "NeverTellMeTheOdds" -Value {
$this | Where-Object{$_ % 2 -ne 0}
}
$myArray.AddRange(1..10)
$myArray.NeverTellMeTheOdds()
请注意,该数组已添加其成员,然后我们添加了它的元素。
正如Matt所评论的那样,您可以通过将Add-Member
作为-InputObject
参数的位置参数提供给可枚举类型。
要允许增加新的属性后,调整大小,使用的通用List
代替@()
:
$list = [System.Collections.Generic.List[psobject]]::new()
$list.AddRange(@(
[pscustomobject]@{SessionId = 1; Active = $true}
[pscustomobject]@{SessionId = 2; Active = $false}
[pscustomobject]@{SessionId = 3; Active = $true}
) -as [psobject[]])
Add-Member -InputObject $list -MemberType ScriptProperty -Name ActiveSessionCount -Value {
return @($this |? Active -eq $true).Count
}
现在您可以轻松地检索活动会话数:
PS C:\> $list.ActiveSessionCount
2
我建议了一个数组列表。我们觉得看起来很像。 – Matt
只要使用'添加 - 成员-InputObject $会话...'?这就是 – Matt
要注意的是,附加到该数组('$ sessions + = ...')将替换数组,从而删除附加属性。一个更安全的方法是一个自定义对象,它具有不同的数组和状态属性。有了这个说法,根据你想要使用的内容,使用不同的列表变量'$ activeSessions' /'$ inactiveSessions'可能更合适,而不是将属性添加到列表中,或者添加一个'Active'属性到个别会话对象。 –
@Matt如果你只是想要回答一个问题......我实际上是在懒惰中滥用了“Select-Object”,这让我无法接受我的解决方案。谢谢。 @AnsgarWiechers感谢关于'+ ='的提示,帮我省略了错误的Add-Member调用。 – FatalMerlin