您正在尝试创建一个array of [pscustomobject]
在你的$outputArray
多变的迭代地,使用+=
, but 你不初始化 $outputArray
作为数组- 有关结果行为的解释,请参阅底部部分。
因此,解决您问题的直接方法就是这样做:
# Do this before your `foreach` loop, then `+=` will work for appending elements.
$outputArray = @()
然而,using +=
添加到数组效率低下,因为实际上一个new每次都必须创建数组实例,因为数组是不可变的数据结构。也就是说,每次+=
使用时,PowerShell 在幕后创建一个新的数组实例,现有元素以及新元素都会复制到该实例。
一个更简单、更有效的方法是让电源外壳使用以下命令为您创建一个数组foreach
循环作为表达并将其分配给一个变量作为一个整体:
也就是说,PowerShell 会自动收集循环每次迭代中的输出:
一个简化的例子:
# Create an array of 10 custom objects
[array] $outputArray = foreach ($i in 1..10) {
# Create and implicitly output a custom object in each iteration.
[pscustomobject] @{
Number = $i
}
}
注意类型约束的使用[array]
到左侧$outputArray
,这确保了变量值是always一个数组,即使循环恰好产生one输出对象(在这种情况下,PowerShell 将仅存储该对象本身,而不是将其包装在数组中)。
注意你可以类似地使用for
, if
, do
/ while
/ switch
作为表达式的语句.
然而,在所有情况下,这些语句只能充当表达式通过他们自己;遗憾的是,使用它们作为管道的第一段 or 将它们嵌入到更大的表达式中 does not工作见GitHub 问题 #6817.
As for 你尝试过什么:
$outputArray += $objResult
因为你没有初始化$outputArray
在循环之前,变量在循环中隐式创建first迭代:
如果 LHS 变量尚不存在,+=
实际上等同于=
:也就是说,RHS 按原样存储在 LHS 变量中,因此$outputArray
现在包含一个[pscustomobject]
实例。
In the second迭代,因为$outputArray
现在有一个值,+=
现在尝试执行适合类型的操作+
操作(例如数字的数字加法和字符串的连接),但没有+
(op_Addition()
) 操作是为类型定义的[pscustomobject]
,所以运算fails以及您看到的错误消息。