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

时间:2017-09-11 11:39:17

标签: arrays powershell properties pscustomobject

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

我知道我可以使用

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

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

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

2 个答案:

答案 0 :(得分:4)

如上所述,您的问题的答案是在数组对象上使用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()

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

答案 1 :(得分:1)

正如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