如何将自定义 属性 添加到 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.
根据您的用例,还有其他选项可以满足您的需求。您可以将数组元素保存到不同的变量中:
# 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
假设我有一个 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.
根据您的用例,还有其他选项可以满足您的需求。您可以将数组元素保存到不同的变量中:
# 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