PowerShell runspace 的创建,使用和查错
今天拜读了The Scripting Guy关于runspace的几篇大作,温故而知新,一些忽略的地方更为清楚。
https://blogs.technet.microsoft.com/heyscriptingguy/2015/11/26/beginning-use-of-powershell-runspaces-part-1/
runspace这两年在PowerShell使用的频率越来越高,由于他的高效率,基本上很多时候已经取代了传统的Job后台操作。不管是多线程实现,或者是后台操作,亦或是***脚本,runspace 的性能可以是job的几十倍以上。
现在由浅入深的看几个例子,到底是怎么实现的。
例1 同步操作一个PowerShell实例
创建一个PowerShell的实例,然后添加一段代码,然后invoke执行。
注意几点:
PowerShell不仅仅是一个脚本语言,我们可以通过这个类System.Management.Automation.PowerShell所提供的方法来创建实例,添加脚本和参数。
Powershell 作为平台的使用方法参考https://blogs.msdn.microsoft.com/powershell/2013/10/01/paap-windows-powershell-as-a-platform-part-1/
我使用了[void]的目的是避免输出太多乱起八糟的信息(比如当前runspace的信息等等)来污染我的输出结果
我在这个脚本里面添加了一条等待10秒的命令,当我们执行invoke命令的时候,会看见屏幕上卡了10秒以后,才返回当前的时间。 这种同步的操作在执行多线程和后台操作的时候应该避免,后面我们会说如何实现异步操作。
可以看见执行invoke之后直接返回了一个结果,事实上,这个和我直接在控制台输入Get-Date的效果一样,这样的脚本并不适合在后台操作。
例2,异步操作Runspace和PowerShell实例。
这一次,我们创建一个runspace的对象,然后把它绑定到一个PowerShell的实例中,运行这个runspace,然后和上面一样,给这个PowerShell的实例添加脚本。请注意,一个很重要的改进是这里使用了BeginInvoke()方法,这个会返回一个异步的对象。异步和同步的区别在于,同步会死等在某个环节,直到输出结果,而异步会自动切换出来,定期的检查结果,等操作结束之后,再切换回去获取结果。
一个简单有趣的C#例子老王洗澡很生动了对比了同步和异步操作
http://www.cnblogs.com/lxblog/archive/2012/12/11/2813893.html
回到之前的脚本,我们来看看BeginInvoke返回的异步对象是什么样。因为我设置了要等10秒钟,所以可以看见他的IsComleted属性是False
10秒钟以后再查看,就已经变成True,这表示操作已经结束。
现在我们调用EndInvoke这个异步对象切换回去获取结果
成功获取结果
最后别忘记关掉这个实例。
$PowerShell.Dispose()例3 给PowerShell的平台传递参数
比如我定义了2个变量,我可以通过AddArgument来传递到脚本块里,当然脚本块里面也得定义对应的参数,然后按顺序传入变量。
例4 如果参数过多,我可以通过定义hash表和 addParameters来传递参数,这样显得更为简洁。
$ParamList = @{param1 = 'Kevin'Param2 = 'receptionist' } $PowerShell = [powershell]::Create() [void]$PowerShell.AddScript({Param ($Param1, $Param2)[pscustomobject]@{name = $Param1title = $Param2} }).AddParameters($ParamList) #Invoke the command $PowerShell.Invoke() $PowerShell.Dispose()例5 整合上面的知识点,来个完整的例子,例如使用 runspace pool来实现多线程的Ping
这个是我之前写过的一个例子。http://beanxyz.blog.51cto.com/5570417/1760880
例6, 最后看看来怎么debug runspace。 PowerShell 5 以后提供了一个命令 Debug-Runspace可以像普通的debug一样来跟踪当前执行的命令或者脚本。
先直接创建一个runspace,可以看见他的状态是available
$rs=[runspacefactory]::CreateRunspace() $rs.name="MyRunSpace" $rs.open() get-runspace把这个runspace绑定到一个powershell的实例,绑定某个脚本,异步执行
可以看见他的状态变成了busy
这个时候我们来debug一下
Debug-Runspace Myrunspace他自动就切换到我的脚本页面了,按F10就会一行行的自动跟踪执行下去了
如果需要终止debug,在控制台输入 detach 就可以了
参考资料
1. https://blogs.msdn.microsoft.com/powershell/2015/09/08/powershell-runspace-debugging-part-1/
2. https://blogs.msdn.microsoft.com/powershell/2013/10/01/paap-windows-powershell-as-a-platform-part-1/
3. http://www.cnblogs.com/lxblog/archive/2012/12/11/2813893.html
4. https://blogs.technet.microsoft.com/heyscriptingguy/2015/11/26/beginning-use-of-powershell-runspaces-part-1/
总结
以上是生活随笔为你收集整理的PowerShell runspace 的创建,使用和查错的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 常用的Firefox浏览器插件、Chro
- 下一篇: JAVA中获取当前运行的类名,方法名,行