如何将自定义 属性 添加到 PowerShell 数组?

How to add a custom property to a PowerShell array?

假设我有一个 PowerShell 数组 $Sessions = @(),我将用 PSCustomObjects 填充它。如何将自定义 属性 添加到数组本身?例如。所以我可以有内置的$Sessions.Count和我想设置为活动会话数的$Sessions.Active

我知道我可以使用

向 PSCustomObjects 添加属性(以肮脏的方式)
$MyCustomObject = "" | Select-Object Machine, UserName, SessionTime

但是尽管在数组上这样做不会导致添加 属性。

那么我怎样才能实现我的目标呢?有什么方法可以创建自定义数组吗?

如前所述,您的问题的答案是仅在数组对象上使用 Add-Member

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

在创建对象后向每个元素添加一个属性是相似的。

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

这当然带有警告(我忘记了)。来自评论

Beware, though, that appending to that array ($sessions += ...) will replace the array, thus removing the additional property.

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 存储状态 属性 和 post 过程:

# 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