2010-07-24 52 views
23

我想在PowerShell中將一些文件解析操作與網絡活動並行化。快速谷歌它, 啓動線程看起來像一個解決方案,但是:PowerShell中的線程是如何工作的?

術語「啓動線程」沒有被識別爲cmdlet,函數,腳本文件或可操作的程序的名稱。檢查名稱的拼寫,或者如果包含路徑,請驗證路徑是否正確,然後重試。

當我嘗試開始工作時發生同樣的事情。

我也試着擺弄周圍有System.Threading.Thread

[System.Reflection.Assembly]::LoadWithPartialName("System.Threading") 
#This next errors, something about the arguments I can't figure out from the documentation of .NET 
$tstart = new-object System.Threading.ThreadStart({DoSomething}) 
$thread = new-object System.Threading.Thread($tstart) 
$thread.Start() 

所以,我認爲最好是知道我做錯了,當我開始使用多線程,因爲它似乎替別人打工。我使用v2.0,我不需要向下兼容。

+0

** tl; dr:**'receive-job(wait-job($ a = start-job {「heyo!」})); remove-job $ a'或'$ a = start-job {「heyo!」 };等待工作$ a;獲得工作$ a; remove-job $ a'還要注意,如果你在作業完成之前調用'receive-job',你可能什麼也得不到。 – Andrew 2017-11-22 18:46:58

+0

另外'(get-job $ a).jobstateinfo.state;' – Andrew 2017-11-22 19:02:29

回答

28

Powershell沒有名爲Start-Thread的內置命令。

但是,V2.0確實有PowerShell作業,它們可以在後臺運行,並且可以被視爲等同於線程。您可以使用以下命令來處理作業:

Name        Category Synopsis 
----        -------- -------- 
Start-Job       Cmdlet Starts a Windows PowerShell background job. 
Get-Job       Cmdlet Gets Windows PowerShell background jobs that are running in the current ... 
Receive-Job      Cmdlet Gets the results of the Windows PowerShell background jobs in the curren... 
Stop-Job       Cmdlet Stops a Windows PowerShell background job. 
Wait-Job       Cmdlet Suppresses the command prompt until one or all of the Windows PowerShell... 
Remove-Job      Cmdlet Deletes a Windows PowerShell background job. 

以下是有關如何使用它的示例。要開始工作,使用的啓動工作,並通過一個腳本塊,其中包含要異步運行的代碼:

$job = start-job { get-childitem . -recurse } 

此命令將啓動一個作業,是可以獲得所有的孩子在當前目錄下遞歸,會讓你立即返回到命令行。

您可以檢查$job變量,看是否工作已經完成,等等。如果你想等待一個作業完成,使用:

wait-job $job 

最後,從工作收到了效果,使用方法:

receive-job $job 
+4

Start-Job實際上啓動了一個新的Powershell會話並且很繁重。它不啓動一個線程。 – ca9163d9 2012-12-22 07:19:53

+0

Start-Job不會捕獲任何環境狀態,也不會捕獲任何本地語言,函數或模塊導入,具有巨大開銷並且是典型的吸吮PowerShell API。這將是非常有用的如果.NET TPL可以用於一些調度到PS運行空間策略 – 2016-09-15 19:00:47

8

不能使用線程直接這樣,但你不能指責,因爲一旦整個BCL躺在你面前這不是完全愚蠢的期望大部分工作努力:)

PowerShell在管道中運行scriptblocks,這又會要求運行空間執行它們。我前段時間討論瞭如何爲v2 ctp3推出自己的MT腳本,但技術(和API)仍然相同。主要工具是[runspacefactory][powershell]類型。看看這裏:以上

http://www.nivot.org/2009/01/22/CTP3TheRunspaceFactoryAndPowerShellAccelerators.aspx

是接近MT腳本的最輕量級的方式。通過開始工作,獲得工作,在第二版中有後臺工作支持,但我想你已經發現了這一點,並看到他們相當重量級。

4

我有一篇關於如何多線程處理任何給定PowerShell腳本的博客文章。

http://ryan.witschger.net/?p=22

享受!

+0

這個腳本太棒了!非常感謝你的發佈。 – Sune 2012-03-09 19:01:08

+6

此文章已不可用。 – 2014-04-15 16:52:03

+3

https://web.archive.org/web/20130127083728/http://ryan.witschger.net/?p=22 – Mick 2014-04-29 06:21:07