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)
但是,尽管对数组执行此操作不会导致添加属性。
那么我如何实现我的目标呢?有什么方法可以创建自定义数组?
如上所述,您的问题的答案将是仅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 + = ...)将替换该数组,从而删除其他属性。
根据您的用例,还有其他选择可以满足您的需求。您可以将数组元素保存到不同的变量中:
# 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)
注意,数组添加了成员,然后添加了元素。