假设我有一个PowerShell数组$Sessions = @()
,我将填充PSCustomObjects。如何向阵列本身添加自定义属性?例如。所以我可以使用内置的$Sessions.Count
和我想要设置为活动会话数的$Sessions.Active
。
我知道我可以使用
向PSCustomObjects添加属性(以脏的方式)$MyCustomObject = "" | Select-Object Machine, UserName, SessionTime
但是在数组上这样做不会导致添加属性。
那么我怎样才能实现目标呢?有没有办法创建自定义数组?
答案 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 + = ...)将替换该数组,从而删除其他属性。
根据您的使用情况,还有其他选项可以满足您的需求。您可以将数组元素保存到不同的变量中:
# 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