about_Jobs
Krótki opis
Zawiera informacje o tym, jak zadania w tle programu PowerShell uruchamiają polecenie lub wyrażenie w tle bez interakcji z bieżącą sesją.
Długi opis
Program PowerShell współbieżnie uruchamia polecenia i skrypty za pośrednictwem zadań. Istnieją trzy typy zadań udostępniane przez program PowerShell do obsługi współbieżności.
RemoteJob
- Polecenia i skrypty są uruchamiane w sesji zdalnej. Aby uzyskać informacje, zobacz about_Remote_Jobs.BackgroundJob
- Polecenia i skrypty są uruchamiane w osobnym procesie na komputerze lokalnym.PSTaskJob
lubThreadJob
— polecenia i skrypty są uruchamiane w osobnym wątku w ramach tego samego procesu na komputerze lokalnym. Aby uzyskać więcej informacji, zobacz about_Thread_Jobs.
Zdalne uruchamianie skryptów na osobnej maszynie lub w osobnym procesie zapewnia doskonałą izolację. Wszelkie błędy występujące w zadaniu zdalnym nie mają wpływu na inne uruchomione zadania lub sesję nadrzędną, która uruchomiła zadanie. Jednak warstwa komunikacji automatycznej dodaje obciążenie, w tym serializacji obiektów. Wszystkie obiekty są serializowane i deserializowane, ponieważ są przekazywane między sesją nadrzędną a sesją zdalną (zadanie). Serializacja dużych złożonych obiektów danych może zużywać duże ilości zasobów obliczeniowych i pamięci oraz transferować duże ilości danych w sieci.
Zadania oparte na wątkach nie są tak niezawodne, jak zadania zdalne i w tle, ponieważ są uruchamiane w tym samym procesie w różnych wątkach. Jeśli jedno zadanie ma krytyczny błąd powodujący awarię procesu, wszystkie inne zadania w procesie zostaną zakończone.
Jednak zadania oparte na wątkach wymagają mniejszego obciążenia. Nie używają warstwy komunikacji sieciowej ani serializacji. Obiekty wynikowe są zwracane jako odwołania do obiektów na żywo w bieżącej sesji. Bez tego obciążenia zadania oparte na wątkach działają szybciej i używają mniejszej liczby zasobów niż inne typy zadań.
Ważne
Sesja nadrzędna, która utworzyła zadanie, monitoruje również stan zadania i zbiera dane potoku. Proces podrzędny zadania zostaje zakończony przez proces nadrzędny po osiągnięciu stanu zakończenia zadania. Jeśli sesja nadrzędna zostanie zakończona, wszystkie uruchomione zadania podrzędne zostaną zakończone wraz z procesami podrzędnymi.
Istnieją dwa sposoby obejścia tej sytuacji:
- Służy
Invoke-Command
do tworzenia zadań uruchamianych w sesjach bez połączenia. Aby uzyskać więcej informacji, zobacz about_Remote_Jobs. - Użyj
Start-Process
polecenia , aby utworzyć nowy proces, a nie zadanie. Aby uzyskać więcej informacji, zobacz Rozpoczynanie procesu.
Polecenia cmdlet zadania
Start-Job
- Uruchamia zadanie w tle na komputerze lokalnym.Get-Job
— Pobiera zadania w tle, które zostały uruchomione w bieżącej sesji.Receive-Job
— Pobiera wyniki zadań w tle.Stop-Job
— Zatrzymuje zadanie w tle.Wait-Job
— Pomija wiersz polecenia do momentu ukończenia jednego lub wszystkich zadań.Remove-Job
— Usuwa zadanie w tle.Invoke-Command
- Parametr AsJob tworzy zadanie w tle na komputerze zdalnym. Możesz użyćInvoke-Command
polecenia , aby zdalnie uruchomić dowolne polecenie zadania, w tymStart-Job
.
Jak uruchomić zadanie na komputerze lokalnym
Aby uruchomić zadanie w tle na komputerze lokalnym, użyj Start-Job
polecenia cmdlet .
Aby napisać Start-Job
polecenie, należy ująć polecenie, które zadanie jest uruchamiane w nawiasach klamrowych ({}
). Użyj parametru ScriptBlock , aby określić polecenie .
Następujące polecenie uruchamia zadanie w tle, które uruchamia Get-Process
polecenie na komputerze lokalnym.
Start-Job -ScriptBlock {Get-Process}
Po uruchomieniu zadania w tle wiersz polecenia jest zwracany natychmiast, nawet jeśli zadanie zajmuje dłuższy czas. Możesz kontynuować pracę w sesji bez przerwy podczas uruchamiania zadania.
Polecenie Start-Job
zwraca obiekt reprezentujący zadanie. Obiekt zadania zawiera przydatne informacje o zadaniu, ale nie zawiera wyników zadania.
Obiekt zadania można zapisać w zmiennej, a następnie użyć go z innymi poleceniami cmdlet zadania w celu zarządzania zadaniem w tle. Następujące polecenie uruchamia obiekt zadania i zapisuje wynikowy obiekt zadania w zmiennej $job
.
$job = Start-Job -ScriptBlock {Get-Process}
Począwszy od programu PowerShell 6.0, możesz użyć operatora w tle (&
) na końcu potoku, aby uruchomić zadanie w tle. Aby uzyskać więcej informacji, zobacz operator tła.
Użycie operatora w tle jest funkcjonalnie równoważne użyciu Start-Job
polecenia cmdlet w poprzednim przykładzie.
$job = Get-Process &
Pobieranie obiektów zadań
Polecenie Get-Job
cmdlet zwraca obiekty reprezentujące zadania w tle, które zostały uruchomione w bieżącej sesji. Bez parametrów Get-Job
zwraca wszystkie zadania, które zostały uruchomione w bieżącej sesji.
Get-Job
Obiekt zadania zawiera stan zadania, który wskazuje, czy zadanie zostało zakończone. Ukończone zadanie ma stan Ukończono lub Niepowodzenie. Zadanie może być również zablokowane lub uruchomione.
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
Obiekt zadania można zapisać w zmiennej i użyć go do reprezentowania zadania w późniejszym poleceniu. Następujące polecenie pobiera zadanie o identyfikatorze 1 i zapisuje je w zmiennej $job
.
$job = Get-Job -Id 1
Pobieranie wyników zadania
Po uruchomieniu zadania w tle wyniki nie są wyświetlane natychmiast. Aby uzyskać wyniki zadania w tle, użyj Receive-Job
polecenia cmdlet .
W poniższym przykładzie Receive-Job
polecenie cmdlet pobiera wyniki zadania przy użyciu obiektu zadania w zmiennej $job
.
Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
668 7 2672 6168 104 32.26 488 csrss
...
Wyniki zadania można zapisać w zmiennej. Następujące polecenie zapisuje wyniki zadania w zmiennej $job
w zmiennej $results
.
$results = Receive-Job -Job $job
Pobieranie i utrzymywanie wyników częściowych zadań
Polecenie Receive-Job
cmdlet pobiera wyniki zadania w tle. Jeśli zadanie zostało ukończone, Receive-Job
pobiera wszystkie wyniki zadania. Jeśli zadanie jest nadal uruchomione, Receive-Job
pobiera wyniki, które zostały wygenerowane do tej pory. Możesz ponownie uruchomić Receive-Job
polecenia, aby uzyskać pozostałe wyniki.
Domyślnie usuwa wyniki z pamięci podręcznej, Receive-Job
w której są przechowywane wyniki zadania. Po ponownym uruchomieniu Receive-Job
uzyskasz tylko nowe wyniki, które dotarły po pierwszym uruchomieniu.
Następujące polecenia pokazują wyniki Receive-Job
poleceń uruchamianych przed ukończeniem zadania.
C:\PS> Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
C:\PS> Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
68 3 2632 664 29 0.36 1388 ccmsetup
749 22 21468 19940 203 122.13 3644 communicator
905 7 2980 2628 34 197.97 424 csrss
1121 25 28408 32940 174 430.14 3048 explorer
Użyj parametru Keep , aby uniemożliwić Receive-Job
usunięcie zwracanych wyników zadania. Następujące polecenia pokazują efekt użycia parametru Keep dla zadania, które nie zostało jeszcze ukończone.
C:\PS> Receive-Job -Job $job -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
C:\PS> Receive-Job -Job $job -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
68 3 2632 664 29 0.36 1388 ccmsetup
749 22 21468 19940 203 122.13 3644 communicator
905 7 2980 2628 34 197.97 424 csrss
1121 25 28408 32940 174 430.14 3048 explorer
Oczekiwanie na wyniki
Jeśli uruchamiasz polecenie, które trwa długo, możesz użyć właściwości obiektu zadania, aby określić, kiedy zadanie zostało ukończone. Następujące polecenie używa Get-Job
obiektu , aby pobrać wszystkie zadania w tle w bieżącej sesji.
Get-Job
Wyniki są wyświetlane w tabeli. Stan zadania jest wyświetlany w kolumnie Stan .
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
2 Job2 BackgroundJob Running True localhost Get-EventLog -Log ...
3 Job3 BackgroundJob Complete True localhost dir -Path C:\* -Re...
W tym przypadku właściwość State ujawnia, że zadanie 2 jest nadal uruchomione. Jeśli chcesz użyć Receive-Job
polecenia cmdlet , aby uzyskać wyniki zadania teraz, wyniki będą niekompletne. Możesz wielokrotnie używać Receive-Job
polecenia cmdlet, aby uzyskać wszystkie wyniki. Użyj właściwości State, aby określić, kiedy zadanie zostało ukończone.
Możesz również użyć parametru Wait polecenia Receive-Job
cmdlet. W przypadku użycia tego parametru polecenie cmdlet nie zwraca wiersza polecenia, dopóki zadanie nie zostanie ukończone, a wszystkie wyniki będą dostępne.
Możesz również użyć Wait-Job
polecenia cmdlet , aby poczekać na dowolne lub wszystkie wyniki zadania. Wait-Job
Umożliwia oczekiwanie na jedno lub więcej konkretnych zadań lub dla wszystkich zadań.
Następujące polecenie używa Wait-Job
polecenia cmdlet do oczekiwania na zadanie o identyfikatorze 10.
Wait-Job -ID 10
W związku z tym monit programu PowerShell jest pomijany do momentu ukończenia zadania.
Możesz również poczekać na wstępnie określony okres czasu. To polecenie używa parametru Limit czasu , aby ograniczyć czas oczekiwania do 120 sekund. Po wygaśnięciu czasu zostanie zwrócony wiersz polecenia, ale zadanie będzie nadal działać w tle.
Wait-Job -ID 10 -Timeout 120
Zatrzymywanie zadania
Aby zatrzymać zadanie w tle, użyj Stop-Job
polecenia cmdlet . Następujące polecenie uruchamia zadanie umożliwiające pobranie każdego wpisu w dzienniku zdarzeń systemu. Zapisuje obiekt zadania w zmiennej $job
.
$job = Start-Job -ScriptBlock {Get-EventLog -Log System}
Następujące polecenie zatrzymuje zadanie. Używa operatora potoku (|
), aby wysłać zadanie w zmiennej $job
do Stop-Job
.
$job | Stop-Job
Usuwanie zadania
Aby usunąć zadanie w tle, użyj Remove-Job
polecenia cmdlet . Następujące polecenie usuwa zadanie w zmiennej $job
.
Remove-Job -Job $job
Badanie zadania, które zakończyło się niepowodzeniem
Zadania mogą zakończyć się niepowodzeniem z wielu powodów. obiekt zadania zawiera właściwość Reason , która zawiera informacje o przyczynie błędu.
Poniższy przykład uruchamia zadanie bez wymaganych poświadczeń.
$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Get-Job $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Failed False localhost New-Item -Path HKLM:...
Sprawdź właściwość Reason, aby znaleźć błąd, który spowodował niepowodzenie zadania.
$job.ChildJobs[0].JobStateInfo.Reason
W takim przypadku zadanie nie powiodło się, ponieważ komputer zdalny wymagał jawnych poświadczeń do uruchomienia polecenia. Właściwość Reason zawiera następujący komunikat:
Połączenie do serwera zdalnego nie powiodło się z powodu następującego komunikatu o błędzie: "Odmowa dostępu".