当仅添加一个PSCustomObject时,PowerShell为什么将ArrayList转换为PSCustomObject?

问题描述 投票:0回答:1

我正在编写代码,以获取所有符合条件的文件。对于找到的每个文件,我创建一个仅包含几个文件($ 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 arraylist
1个回答
0
投票

集合会在PowerShell中自动展开,因为各个元素会沿着管道传递。如果要保证即使只有一个元素,变量也仍然是一个集合,可以使用一些技巧(以下示例使用Get-Process,但可以使用任何返回集合的集合变量或cmdlet):

  1. 将命令包装在数组中(例如$myCollection = @(Get-Process)
  2. 用逗号,字符(例如$myCollection = , (Get-Process)]前缀可能的收藏集>
  3. @()指定了一个数组,您可以为其提供元素列表或使用可能返回集合的cmdlet。

, (Get-Process)语法看起来很奇怪,但这与为数组指定元素的硬编码列表的语法相同。考虑以下内容:

$myArray = 1, 2, 3, 4, 5, "Bender"

这将创建一个包含元素12345"Bender"的数组。不过,在上面的简写中,仅在表达式中提供,作为第一个字符就表示这是一个数组,请照此处理。由于PowerShell展开集合的性质,在该初始逗号之后返回的所有后续数组/集合都将添加到最终集合中。

© www.soinside.com 2019 - 2024. All rights reserved.