6

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

我知道我可以向 PSCustomObjects 添加属性(以一种肮脏的方式)

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

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

那么我怎样才能实现我的目标呢?有没有办法创建自定义数组?

4

2 回答 2

13

如前所述,您的问题的答案是仅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()

请注意,数组添加了它的成员,然后我们添加了它的元素。

于 2017-09-11T12:59:06.283 回答
2

正如马特评论的那样,您可以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
于 2017-09-11T13:00:11.830 回答