运行空间: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
脚本块
$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