如何将自定义属性添加到PowerShell阵列?

问题描述:

假设我有一个PowerShell数组$Sessions = @(),我将填写PSCustomObjects。我怎样才能将自定义属性添加到数组本身?例如。所以我可以有$Sessions.Count这是内置和$Sessions.Active我想设置为活动会话计数。如何将自定义属性添加到PowerShell阵列?

我知道,我可以

$MyCustomObject = "" | Select-Object Machine, UserName, SessionTime 

属性添加到PSCustomObjects(在一个肮脏的方式),但尽管这样做的阵列上不会导致财产被添加。

那么我该如何实现我的目标?有什么办法来创建自定义数组?

+2

只要使用'添加 - 成员-InputObject $会话...'?这就是 – Matt

+0

要注意的是,附加到该数组('$ sessions + = ...')将替换数组,从而删除附加属性。一个更安全的方法是一个自定义对象,它具有不同的数组和状态属性。有了这个说法,根据你想要使用的内容,使用不同的列表变量'$ activeSessions' /'$ inactiveSessions'可能更合适,而不是将属性添加到列表中,或者添加一个'Active'属性到个别会话对象。 –

+0

@Matt如果你只是想要回答一个问题......我实际上是在懒惰中滥用了“Select-Object”,这让我无法接受我的解决方案。谢谢。 @AnsgarWiechers感谢关于'+ ='的提示,帮我省略了错误的Add-Member调用。 – FatalMerlin

你所说的问题的答案如上所述将只在数组对象上使用Add-Member

Add-Member -InputObject $sessions -MemberType NoteProperty -Name "State" -Value "Fabulous" 

添加属性的每个元素创建的对象类似于后。

$sessions | ForEach-Object{ 
    $_ | Add-Member -MemberType NoteProperty -Name "State" -Value "Fabulous" 
} 

这当然带有警告(我忘记了)。从注释

但是,请注意,附加到该数组($ sessions + = ...)将替换数组,从而删除附加属性。

Ansgar Wiechers

根据您的使用情况下,有其他的选择,让你想你想要的。您可以保存数组元素为不同的变量:

# 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 
+1

我建议了一个数组列表。我们觉得看起来很像。 – Matt