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

Fat*_*lin 0 arrays powershell properties pscustomobject

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

我知道我可以使用以下方式将属性添加到PSCustomObjects中:

$MyCustomObject = "" | Select-Object Machine, UserName, SessionTime
Run Code Online (Sandbox Code Playgroud)

但是,尽管对数组执行此操作不会导致添加属性。

那么我如何实现我的目标呢?有什么方法可以创建自定义数组?

Mat*_*att 5

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

Add-Member -InputObject $sessions -MemberType NoteProperty -Name "State" -Value "Fabulous"
Run Code Online (Sandbox Code Playgroud)

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

$sessions | ForEach-Object{
    $_ | Add-Member -MemberType NoteProperty -Name "State" -Value "Fabulous"
}
Run Code Online (Sandbox Code Playgroud)

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

但是请注意,追加到该数组($ 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
}
Run Code Online (Sandbox Code Playgroud)

或者,您仍然可以Where-Object根据需要存储状态属性和发布流程:

# Process each inactive session
$sessions | Where-Object{$_.State -eq "Active"} | ForEach-Object{}
Run Code Online (Sandbox Code Playgroud)

为了避免破坏/重新创建数组的问题(这可能是性能损失),您也可以改用数组列表。

$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()
Run Code Online (Sandbox Code Playgroud)

注意,数组添加了成员​​,然后添加了元素。