运行空间:EndInvoke() 无法 return 所有脚本块输出,只有最后一个异常

runspace: EndInvoke() fails to return all the scriptblocks output , only the last exception

脚本块

$sb = {
 write-output "Testing 1"
 write-output "Testing 2"
 throw " Exception in sb"
}

仅调用 EndInvoke() 下面的 returns。我的运行空间任务在某些情况下长达数小时。除了最后一个异常,我不能丢失所有输出。当脚本块传递到我的 cmdlet 时,我无法控制它们。

我该如何解决?

Exception calling "EndInvoke" with "1" argument(s): " Exception in sb"
At line:1 char:1
+ $j.PowerShell.EndInvoke($j.Job)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : RuntimeException

当您致电 EndInvoke() 时,您已经太迟了。无法从输出流接收数据,因为所有数据都被丢弃了,您唯一会得到的是抛出的异常消息。相反,您必须更改初始 BeginInvoke() 调用的方式以允许您捕获输出。

使用重载的 BeginInvoke(TInput,TOutput) 调用,您既可以传递输入命令(如果需要,也可以为空),并且必须为要存储的输出([= 类型)提供缓冲区16=]).所以你的代码看起来像这样:

$sb = {
 write-output "Testing 1"
 write-output "Testing 2"
 throw " Exception in sb"
}

$PowerShell = [powershell]::Create()

[void]$PowerShell.AddScript($sb)

$InputObject = New-Object 'System.Management.Automation.PSDataCollection[psobject]'
$OutputObject = New-Object 'System.Management.Automation.PSDataCollection[psobject]'

$Handle = $PowerShell.BeginInvoke($InputObject,$OutputObject)

调用 EndInvoke() 会给你错误信息:

PS C:\> $PowerShell.EndInvoke($Handle)
Exception calling "EndInvoke" with "1" argument(s): " Exception in sb"
At line:1 char:1
+ $PowerShell.EndInvoke($Handle)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : RuntimeException

但输出存储在 $OutputObject 缓冲区中:

PS C:\> $InputObject
PS C:\> $OutputObject
Testing 1
Testing 2