将进程添加到arrayList时,powershell中出现错误的原因是什么?

时间:2017-01-20 20:06:38

标签: powershell arraylist

我的代码

[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]就好了。

2 个答案:

答案 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 类型的对象,因此是静态数据类型赋值。