我的代码
[System.Collections.ArrayList]$Global:shells=@()
$cmdProc = Start-Process powershell -ArgumentList "-noexit", ("-command grunt "+ [string]$argList) -WorkingDirectory $fwd -PassThru
[System.Collections.ArrayList]$Global:shells.Add(($cmdProc))
确实向$shells
arrayList添加了PowerShell进程。但它也会显示错误消息:
cannot convert the "0" value of type "System.Int32" to type "System.Collections.ArrayList". At line:16 char:1 + [System.Collections.ArrayList]$Global:shells.Add(($cmdProc))
它确实与它添加的arrayList的索引相关,但是发生了什么?我可以访问$shells[0]
就好了。
答案 0 :(得分:3)
在最后一句话中:
[System.Collections.ArrayList]$Global:shells.Add(($cmdProc))
PowerShell尝试将Add()
方法调用(即0
,即刚插入的索引)的输出转换为ArrayList,因为前面有[System.Collections.ArrayList]
字面值。
将其更改为:
[void]$Global:shells.Add(($cmdProc))
答案 1 :(得分:1)
在我看来,更好的解决方案是正确设置数组的类型,即:
[System.Diagnostics.Process[]] $Global:shells = @();
try {
$shells += Start-Process powershell <blah blah> -PassThru;
} #try
catch [System.Exception] {
# blah
} #catch
...对于那些不熟悉PowerShell的人, -passthru 参数会导致 Start-Process cmdlet返回它生成的对象。通常这样做是为了让你可以使用这个对象进一步向下推进powershell“管道”。在 Start-Process 的情况下,它返回 System.Diagnostics.Process 类型的对象,因此是静态数据类型赋值。