为什么这段代码不起作用?
$method = {
[System.Collections.ArrayList]$array;
for ($i=0; $i -le 50; $i++) { $array += $i }
}
使用以下命令执行scriptblock:
&$method
在控制台上显示:
1, 2, 3, 4, 5, 6
何时应打印50个数字?
答案 0 :(得分:0)
ArrayList
类型的Add()
method会发出插入新项目的索引。将表达式转换为[void]
,将其传递给Out-Null
或将其分配给$null
以压缩此输出:
[void]$array.Add($i)
# or
$array.Add($i) |Out-Null
# or
$null = $array.Add($i)
如果多次这样做,请避免管道Out-Null
,铸造或分配要比管道快得多。
答案 1 :(得分:0)
您发布的代码根本不应生成任何输出,除非您已在父作用域中定义了变量$array
。声明
[System.Collections.ArrayList]$array
将变量$array
的值转换为类型ArrayList
并回显它。如果变量在父作用域中具有值,则语句将输出值作为数组列表,否则输出将为null。后续循环不会使用该变量,而是增加一个新的(本地)变量$array
。您可以通过在脚本块的末尾放置一个语句$array.GetType().FullName
来验证这一点。您可能会得到System.Int32
,而不是System.Collections.ArrayList
(或System.Object[]
)。
如果要实例化ArrayList
对象,向其添加数字,并在脚本块的末尾输出该列表,则需要将代码更改为以下内容:
$method = {
[Collections.ArrayList]$array = @()
for ($i=0; $i -le 50; $i++) { $array += $i }
$array
}
请注意第一个语句中的赋值操作。
演示:
PS C:\> $sb = { [Collections.ArrayList]$a; 0..50 | % { $a += $_ }; $a.GetType().FullName; $a } PS C:\> &$sb System.Int32 1275 PS C:\> $sb = { [Collections.ArrayList]$a = @(); 0..50 | % { $a += $_ }; $a.GetType().FullName; $a } PS C:\> &$sb System.Collections.ArrayList 0 1 ... 49 50