如何在Powershell Api C#中访问基础管道

时间:2018-07-19 19:27:14

标签: c# powershell pipeline runspace

我需要访问刚由于align-content: center 而创建的基本Powershell默认管道,我需要停止该管道,以便脚本执行必须立即停止。

我知道我可以通过调用pipe.Invoke()创建Pipeline对象并执行脚本。但是Pipeline对象没有给我Powershell实例提供的所有数据流。

Pwoershell.Create();

稍后我需要

powerShellInstance = PowerShell.Create();
powerShellInstance.Runspace = RunspaceFactory.CreateRunspace(iss)

有什么可以实现这一目标的东西吗?

修改

例如,我有以下脚本。

powerShellInstance.GetPipeline().Stop()  // something like this.

编辑(异步停止)     在代码之前。

Set-LinkParameter"withError"  => This commandlet will throw error
Set-LinkParameter11 "Mistyped" "error" => Powershell will throw an error of invalid commandlet

Initialiize-Access  => this is invalid here and this commandlet will throw error.  Here it must not allow further script to execute.

Write-Host "This is test message for host"
Write-Information "test information"

Write-Error "Access denied."  --> this is can be terminating error ( depends)
Write-Warning "This is test warning." 
Write-Verbose "This is verbose message"
Write-Verbose "This is verbose message" -Verbose

Write-Debug "Test Debug message" -Debug
Write-Debug "wont appear at debug pipeline"

Write-Output @(1,2,3) -NoEnumerate | measure

1 个答案:

答案 0 :(得分:0)

不幸的是,您不能直接回答原始问题。没有公开的方法可以通过PowerShell类或其他方式来获取当前正在运行的管道。与Pipeline进行交互的唯一方法是通过Runspace.CreatePipeline创建它。此外,Pipeline API is not available in PowerShell Standard最终将被删除。

针对(“措辞”)“如何在发生错误后如何终止通过PowerShell类调用的PowerShell脚本”的修订问题,答案是使用PowerShell.Stop()

但是,正如您所注意到的,这并不能保证终止。这样做的原因是,当事件触发并调用PowerShell.Stop()时,PowerShell脚本可能已经移至下一个序列点。如果该下一个序列点是阻塞的方法调用,或者是未实现Cmdlet.StopProcessing的cmdlet,则管道将不会停止直到完成。如果它从未完成,那么PowerShell.Stop将永远不会完成。除了终止进程之外,别无他法。