【发布时间】:2019-12-30 09:42:12
【问题描述】:
我正在编写一个代码,它可以获取所有符合条件的文件。对于找到的每个文件,我都创建了一个只有少数文件 ($Obj) 值的自定义对象,然后将其添加到 ArrayList ($Files)。这个ArrayList 然后返回给调用函数并存储在它的变量($OldFiles) 中。
当没有找到文件或找到多个文件时,这可以正常工作。但是,如果只找到一个文件,ArrayList 会将自身转换为PSCustomObject,然后由于返回无法将PSCustomObject 转换为ArrayList,因此引发异常。
奇怪的是,如果我在 return 语句之前添加简单的行 "$Files.getType()",则没有错误,ArrayList 仍然是 ArrayList。
基本上,这不起作用: 在第一个函数中简化:
$Files = [System.Collections.ArrayList]@()
$Files.Add($Obj) > $null
return $Files
这是它在顶部函数中的样子:
$OldFiles = [System.Collections.ArrayList](Check-OldFiles -Path $Directory -Age $Age -FilesOnly:$FilesOnly -Recurse:$Recurse -UserCreationTime:$UserCreationTime)
但这很好用: 在第一个函数中简化:
$Files = [System.Collections.ArrayList]@()
$Files.Add($Obj) > $null
$Files.getType()
return $Files
这是它在顶部函数中的样子:
$OldFiles = [System.Collections.ArrayList](Check-OldFiles -Path $Directory -Age $Age -FilesOnly:$FilesOnly -Recurse:$Recurse -UserCreationTime:$UserCreationTime)
为什么会发生这种情况?
PowerShell 版本为 5.0
【问题讨论】:
-
powershell unrolls 在通过管道发送集合或从函数返回集合时。这意味着它一次发送一个......这也意味着当它到达呼叫的另一端时,一个项目集合将是只有一个项目。您可以使用前导逗号
,$Collection将集合包装在一个数组中,然后再将其发送出去......这将作为一个集合展开。 -
@Lee_Dailey 我在使用管道时知道解包,但我不知道从函数返回时它会执行相同的操作。您在集合前使用逗号的提示很有魅力,非常感谢!
标签: powershell arraylist