上一次的博客中我们介绍了最为基本的方法在应用程序中使用PowerShell引擎,当然这是最为简单的使用方式虽然简单当然也很有效,只不过不要忘记当不想再使用 RunspaceInvoke 实例的时候调用

实例的Dispose() 方法对其资源进行释放,也许你也已经尝试在你的应用程序中使用了这种方法

或许你也已经发现这中方法有一个巨大的问题 那就是通过简单的代码创建RunspaceInvoke 但是只能同步执行并且获取结果,也许这种方式在一般情况下并不是什么大问题,在需要长时间的执行的脚本或者命令时候 Invoke()方法将会阻塞当前线程,使得你不得不进行长时间的等待,不得不说这点的确有点让人不爽,我们之前说过选择的简单的办法就要丧失其灵活性。

聪明的你似乎觉得我们今天的主题应该是异步运行了? 我不得不Say No 因为在讨论异步运行之前还有很多事情要做。

So 你就应该知道我们今天讨论的主题是如何开始初步的使用Runspace 和PipeLine

一般来说 如果想在应用程序中使用PowerShell 引擎 我们只要创建Pipeline 就可以完成

但是现在我们还不能创建因为这是依靠Runspace 实例的CreatePipeline() 方法创建

而现在我们都没有创建Runspace 对象实例,Runspace 实例都要通过 RunspaceFactory 的静态方法来创建并且在PowerShellV1 版本时候创的Runspace 实例都是Local Runspace 意味这你讲不能创建基于远程计算机会话的 Runspace 当然 V1版本已经太过久远 我们已经无需思考这个问题

好了说了这么多 下面我们应该看实际代码

clip_p_w_picpath001

事实上代码简单到可以非常容易的理解

我们使用了无配置的静态方法创建了新的Runspace 对象 当然这是使用默认配置

紧接着 我们创建了管道,并且是一个完整的管道 因为我们给管道中放置了新的命令,

最后就像之前一样我们使用Invoke执行了管道中的命令,

请注意创建管道前 Runspace 状态要处于Opened 状态 虽然此时依然可以创建管道但是系统会引发异常

clip_p_w_picpath002

同样CreatePipeline 方法还有另外一个重载接受两个参数

clip_p_w_picpath003

意思是当true 时候 命令将会记录在命令历史记录中以方便使用Get-history 进行查找调用