我正在编写代码,以获取所有符合条件的文件。对于找到的每个文件,我创建一个仅包含几个文件($ 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中自动展开,因为各个元素会沿着管道传递。如果要保证即使只有一个元素,变量也仍然是一个集合,可以使用一些技巧(以下示例使用Get-Process
,但可以使用任何返回集合的集合变量或cmdlet):
$myCollection = @(Get-Process)
),
字符(例如$myCollection = , (Get-Process)
]前缀可能的收藏集>@()
指定了一个数组,您可以为其提供元素列表或使用可能返回集合的cmdlet。
, (Get-Process)
语法看起来很奇怪,但这与为数组指定元素的硬编码列表的语法相同。考虑以下内容:
$myArray = 1, 2, 3, 4, 5, "Bender"
这将创建一个包含元素
1
,2
,3
,4
,5
和"Bender"
的数组。不过,在上面的简写中,仅在表达式中提供,
作为第一个字符就表示这是一个数组,请照此处理。由于PowerShell展开集合的性质,在该初始逗号之后返回的所有后续数组/集合都将添加到最终集合中。