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中获取当前运行的类名,方法名,行