【发布时间】:2022-01-31 03:41:59
【问题描述】:
所以我正在重构一个 Powershell 脚本并将很多东西移动到函数中。当我从带有return $out 的函数(称为Get-OutList)返回一个包含42 个PSObjects 的ArrayList 时,42 条空白记录被插入到ArrayList 的开头,然后是我的原始记录。
我的函数如下所示:
function Get-OutList {
param (
[Parameter(Position=0,mandatory=$true)]
[PSObject]$RoleCollection,
[Parameter(Position=1,mandatory=$true)]
[PSObject]$MemberCollection
)
$out = New-Object System.Collections.ArrayList
$MemberCollection.result | ForEach-Object {
$currentMember = $_
$memberDetail = New-Object PSObject
Add-Member -InputObject $memberDetail -MemberType NoteProperty -Name FirstName -Value $($currentMember.user.first_name)
Add-Member -InputObject $memberDetail -MemberType NoteProperty -Name LastName -Value $($currentMember.user.last_name)
Add-Member -InputObject $memberDetail -MemberType NoteProperty -Name Email -Value $($currentMember.user.email)
Add-Member -InputObject $memberDetail -MemberType NoteProperty -Name Status -Value $($currentMember.status)
$RoleCollection.result | ForEach-Object {
Add-Member -InputObject $memberDetail -MemberType NoteProperty -Name $_.name -Value (&{If($currentMember.roles.name -contains $_.name){"Y"}Else{""}})
}
$out.Add($memberDetail)
}
return $out
}
我了解 Powershell 会将每条记录枚举回调用函数的位置,但我尝试了一些方法无济于事:
- PS v5.1.x 和 v7.3.0 中的行为相同。
- 返回
return @($out)没有任何区别(即,System.Object 有 42 条空白记录,后面跟着我的 42 条原始记录,总共 84 条记录)。 - 返回
return Write-Output -NoEnumerate $out会导致 System.Object 有 42 条空白记录,而我的 42 条原始记录嵌套在第 43 条记录中。 - 使用
$results = [System.Collections.ArrayList](Get-OutList)将函数调用的结果键入为ArrayList 没有区别。
为什么我不能让我的对象与从函数返回之前的对象相同?任何帮助将不胜感激!
编辑#1 包括一个易于重现的示例:
function Get-OutList {
param (
[Parameter(Position=0,mandatory=$true)]
[PSObject]$MemberCollection
)
$out = New-Object 'System.Collections.ArrayList'
$MemberCollection | ForEach-Object {
$memberDetail = New-Object PSObject
Add-Member -InputObject $memberDetail -MemberType NoteProperty -Name FirstName -Value "One"
Add-Member -InputObject $memberDetail -MemberType NoteProperty -Name LastName -Value "Two"
Add-Member -InputObject $memberDetail -MemberType NoteProperty -Name Email -Value "Three"
Add-Member -InputObject $memberDetail -MemberType NoteProperty -Name Status -Value "Four"
$out.Add($memberDetail)
}
return $out
}
$members = @("Joe Bloggs", "Some Dude", "The Dude")
$memberDetails = Get-OutList -MemberCollection $members
Write-Output $memberDetails
如果你在 $out 传回之前添加断点,你会看到有 3 条记录,如果你继续步进,你应该看到 $memberDetails 将有 6 条记录(前 3 条空白)。
编辑#2
使用 Generic.List 而不是 ArrayList 时似乎没有这样的问题。使用$out = [System.Collections.Generic.List[PSObject]]::new() 而不是$out = New-Object 'System.Collections.ArrayList',它工作得很好。
【问题讨论】:
-
在不知道你传递给你的函数的情况下很难说,另一方面,你的函数让我觉得你过于复杂了。提供一个可重复的最小示例,可能会对您有所帮助。
-
@NathanC - 你真的不应该输出一个集合,除非没有其他方法可以完成这项工作。输出一个对象并允许调用者将事物收集到他们想要的任何集合中会更好[也更容易]。 ///// 实际上,我想知道您是否看到了按引用与按值的示例。您可能需要查看 [icky!讨厌! yucky!] 明确设置集合 $Var 的范围。
-
只是为了避免混淆:您看到的额外输出不是 blank 对象,而是来自 @ 的返回值 integers 987654329@ 方法调用,无意中“污染”了函数的输出流。
标签: powershell arraylist