2010-07-24 13 views
23

Chcę zrównoleglić niektóre akcje do parsowania z działaniem sieciowym w powłoce powershell. Szybkie google dla niego startowy wątek wyglądało rozwiązanie, ale:Jak działa wątkowanie w powłoce Power Shell?

Termin „start-nić” nie jest rozpoznawana jako nazwy apletu polecenia, funkcji skryptu lub program wykonywalny. Sprawdź pisownię nazwy lub jeśli ścieżka została uwzględniona, sprawdź, czy ścieżka jest prawidłowa i spróbuj ponownie.

To samo stało się, gdy próbowałem rozpocząć pracę.

Próbowałem też błahy wokół z 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() 

Sądzę więc, że najlepiej byłoby, aby wiedzieć, co robię źle, gdy używam rozpoczęcie wątku, ponieważ wydaje się działać dla innych ludzi. Używam v2.0 i nie potrzebuję kompatybilności w dół.

+0

** tl; dr: ** 'odbiór-praca (praca oczekująca ($ a = start-job {" heyo! "})); remove-job $ a' lub '$ a = start-job {" heyo! " }; wait-job $ a; otrzymywać-praca $ a; remove-job $ a' Zwróć także uwagę, że jeśli wywołasz 'receive-job' przed zakończeniem zadania, możesz nie otrzymać nic. – Andrew

+0

Również '(get-job $ a) .jobstateinfo.state;' – Andrew

Odpowiedz

28

Powershell nie ma wbudowanego polecenia o nazwie wątek początkowy.

V2.0 ma jednak zadania PowerShell, które mogą działać w tle i mogą być traktowane jako odpowiednik wątku. Masz do dyspozycji następujące polecenia do pracy z zadaniami:

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. 

Oto przykład, jak z nim pracować. Aby rozpocząć pracę, korzystanie rozpoczęcie pracy i przekazać blok skryptu, który zawiera kod, który chcesz uruchomić asynchronicznie:

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

Polecenie to rozpocznie pracę, która pobiera wszystkie dzieci w bieżącym katalogu rekursywnie, i będziesz natychmiast wrócić do linii poleceń.

Można sprawdzić zmienną $job aby sprawdzić, czy zadanie zostało zakończone, itd. Jeśli chcesz czekać na zakończenie pracy, zastosowanie:

wait-job $job 

Wreszcie, aby otrzymać wyniki od pracy, używać:

receive-job $job 
+4

Start-Job faktycznie rozpoczyna nową sesję PowerShell i jest ciężki. Nie uruchamia wątku. – ca9163d9

+0

Start-Job nie przechwytuje żadnego stanu środowiska, lokalnie, funkcji ani importu modułów, ma ogromny narzut i jest typowym ssącym interfejsem API PowerShell. Byłoby bardzo pomocne, gdyby można było użyć .NET TPL z pewną wysyłką do strategii przestrzeni startowej PS. –

8

nie można używać bezpośrednio wątki tak, ale nie można winić za próbę od razu cały BCL leży przed tobą to nie jest całkowicie głupie oczekiwać większość z nich do pracy :)

PowerShell uruchamia blockblocks w potokach, które z kolei wymagają przestrzeni roboczych do ich wykonania. Blogowałem o tym, jak uruchomić własne skrypty MT już dawno temu dla v2 ctp3, ale technika (i API) jest wciąż taka sama. Główne narzędzia to typy [runspacefactory] i [powershell]. Spójrz tutaj:

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

Powyższe jest najbardziej lekki sposób podejścia do MT włączony. Istnieje wsparcie pracy w tle w v2 poprzez start-job, get-job, ale pomyślałem, że już to zauważyłeś i zobaczyłeś, że są one dość wadze ciężkiej.

4

Mam artykuł na blogu o tym, jak można wielowątkowe dane skryptu PowerShell.

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

Enjoy!

+0

Ten skrypt jest fantastyczny! Dziękujemy bardzo za wpis. – Sune

+6

Ten artykuł nie jest już dostępny. –

+3

https://web.archive.org/web/20130127083728/http://ryan.witschger.net/?p=22 – Mick

Powiązane problemy