about_Jobs
Krátký popis
Poskytuje informace o tom, jak úlohy na pozadí PowerShellu spouští příkaz nebo výraz na pozadí bez interakce s aktuální relací.
Dlouhý popis
PowerShell souběžně spouští příkazy a skripty prostřednictvím úloh. PowerShell poskytuje tři typy úloh, které podporují souběžnost.
RemoteJob
– Příkazy a skripty se spouští ve vzdálené relaci. Informace najdete v tématu about_Remote_Jobs.BackgroundJob
– Příkazy a skripty se spouští v samostatném procesu na místním počítači.PSTaskJob
neboThreadJob
– Příkazy a skripty se spouští v samostatném vlákně v rámci stejného procesu na místním počítači. Další informace najdete v tématu about_Thread_Jobs.
Vzdálené spouštění skriptů na samostatném počítači nebo v samostatném procesu poskytuje skvělou izolaci. Všechny chyby, ke kterým dochází ve vzdálené úloze, nemají vliv na jiné spuštěné úlohy ani nadřazenou relaci, která úlohu spustila. Vrstva vzdálené komunikace ale přidává režii, včetně serializace objektů. Všechny objekty jsou serializovány a deserializovány, protože se předávají mezi nadřazenou relací a vzdálenou relací (úloha). Serializace velkých složitých datových objektů může spotřebovávat velké objemy výpočetních a paměťových prostředků a přenášet velké objemy dat v síti.
Úlohy založené na vláknech nejsou tak robustní jako vzdálené úlohy a úlohy na pozadí, protože běží ve stejném procesu na různých vláknech. Pokud má jedna úloha kritickou chybu, která proces chybově ukončí, všechny ostatní úlohy v procesu se ukončí.
Úlohy založené na vláknech ale vyžadují menší režii. Nepoužívají vrstvu vzdálené komunikace ani serializaci. Výsledné objekty se vrátí jako odkazy na živé objekty v aktuální relaci. Bez této režie běží úlohy založené na vláknech rychleji a používají méně prostředků než ostatní typy úloh.
Důležité
Nadřazená relace, která vytvořila úlohu, také monitoruje stav úlohy a shromažďuje data kanálu. Podřízený proces úlohy se ukončí nadřazeným procesem, jakmile úloha dosáhne stavu dokončení. Pokud je nadřazená relace ukončena, všechny spuštěné podřízené úlohy se ukončí spolu s podřízenými procesy.
Tato situace se dá obejít dvěma způsoby:
- Slouží
Invoke-Command
k vytváření úloh spuštěných v odpojených relacích. Další informace najdete v tématu about_Remote_Jobs. - Slouží
Start-Process
k vytvoření nového procesu místo úlohy. Další informace naleznete v tématu Start-Process.
Rutiny úloh
Start-Job
– Spustí úlohu na pozadí na místním počítači.Get-Job
– Získá úlohy na pozadí, které byly spuštěny v aktuální relaci.Receive-Job
- Získá výsledky úloh na pozadí.Stop-Job
- Zastaví úlohu na pozadí.Wait-Job
- Potlačí příkazový řádek, dokud nebude dokončena jedna nebo všechny úlohy.Remove-Job
- Odstraní úlohu na pozadí.Invoke-Command
– Parametr AsJob vytvoří na vzdáleném počítači úlohu na pozadí. Můžete použítInvoke-Command
ke vzdálenému spuštění libovolného příkazu úlohy, včetněStart-Job
.
Jak spustit úlohu v místním počítači
Pokud chcete spustit úlohu na pozadí na místním počítači, použijte rutinu Start-Job
.
Pokud chcete napsat Start-Job
příkaz, uzavřete příkaz, který úloha spouští ve složených závorkách ({}
). K zadání příkazu použijte parametr ScriptBlock.
Následující příkaz spustí úlohu na pozadí, která spustí Get-Process
příkaz v místním počítači.
Start-Job -ScriptBlock {Get-Process}
Když spustíte úlohu na pozadí, příkazový řádek se vrátí okamžitě, i když dokončení úlohy trvá delší dobu. Během spuštění úlohy můžete pokračovat v práci v relaci bez přerušení.
Příkaz Start-Job
vrátí objekt, který představuje úlohu. Objekt úlohy obsahuje užitečné informace o úloze, ale neobsahuje výsledky úlohy.
Objekt úlohy můžete uložit do proměnné a pak ho použít s ostatními rutinami Úlohy ke správě úlohy na pozadí. Následující příkaz spustí objekt úlohy a uloží výsledný objekt úlohy do $job
proměnné.
$job = Start-Job -ScriptBlock {Get-Process}
Počínaje PowerShellem 6.0 můžete spustit úlohu na pozadí pomocí operátoru na pozadí (&
) na konci kanálu. Další informace naleznete v tématu operátor pozadí.
Použití operátoru pozadí je funkčně ekvivalentní použití Start-Job
rutiny v předchozím příkladu.
$job = Get-Process &
Získání objektů úloh
Rutina Get-Job
vrátí objekty, které představují úlohy na pozadí, které byly spuštěny v aktuální relaci. Bez parametrů Get-Job
vrátí všechny úlohy, které byly spuštěny v aktuální relaci.
Get-Job
Objekt úlohy obsahuje stav úlohy, který označuje, jestli se úloha dokončila. Dokončená úloha má stav Dokončeno nebo Neúspěšné. Úloha může být také blokovaná nebo spuštěná.
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
Objekt úlohy můžete uložit do proměnné a použít ho k reprezentaci úlohy v pozdějším příkazu. Následující příkaz získá úlohu s ID 1 a uloží ji do $job
proměnné.
$job = Get-Job -Id 1
Získání výsledků úlohy
Když spustíte úlohu na pozadí, výsledky se nezobrazí okamžitě. Pokud chcete získat výsledky úlohy na pozadí, použijte rutinu Receive-Job
.
Následující příklad rutiny Receive-Job
získá výsledky úlohy pomocí objektu úlohy v $job
proměnné.
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
...
Výsledky úlohy můžete uložit do proměnné. Následující příkaz uloží výsledky úlohy v $job
proměnné do $results
proměnné.
$results = Receive-Job -Job $job
Získání a udržování částečných výsledků úlohy
Rutina Receive-Job
získá výsledky úlohy na pozadí. Pokud je úloha dokončená, Receive-Job
získá všechny výsledky úlohy. Pokud je úloha stále spuštěná, Receive-Job
získá dosud vygenerované výsledky. Zbývající výsledky získáte opětovným spuštěním Receive-Job
příkazů.
Ve výchozím nastavení odstraní výsledky z mezipaměti, Receive-Job
kde jsou uloženy výsledky úloh. Po opětovném spuštění Receive-Job
získáte pouze nové výsledky, které přišly po prvním spuštění.
Následující příkazy zobrazují výsledky příkazů spuštěných Receive-Job
před dokončením úlohy.
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
Pomocí parametru Keep zabráníte Receive-Job
odstranění vrácených výsledků úlohy. Následující příkazy ukazují účinek použití parametru Keep na úlohu, která ještě není dokončená.
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
Čekání na výsledky
Pokud spustíte příkaz, který trvá dlouhou dobu, můžete pomocí vlastností objektu úlohy určit, kdy je úloha dokončena. Následující příkaz pomocí objektu Get-Job
získá všechny úlohy na pozadí v aktuální relaci.
Get-Job
Výsledky se zobrazí v tabulce. Stav úlohy se zobrazí ve sloupci Stát .
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...
V tomto případě vlastnost State odhalí, že úloha 2 je stále spuštěná. Pokud byste teď k získání výsledků úlohy použili Receive-Job
rutinu, výsledky by byly neúplné. Pomocí rutiny Receive-Job
můžete opakovaně získat všechny výsledky. Pomocí vlastnosti State určete, kdy je úloha dokončena.
Můžete také použít parametr Wait rutiny Receive-Job
. Pokud použijete tento parametr, rutina nevrátí příkazový řádek, dokud se úloha nedokončí a nebudou k dispozici všechny výsledky.
Rutinu Wait-Job
můžete použít také k čekání na jakékoli nebo všechny výsledky úlohy. Wait-Job
umožňuje počkat na jednu nebo více konkrétních úloh nebo pro všechny úlohy.
Následující příkaz používá rutinu Wait-Job
k čekání na úlohu s ID 10.
Wait-Job -ID 10
V důsledku toho se příkazový řádek PowerShellu potlačí, dokud se úloha nedokončí.
Můžete také počkat na předem určené časové období. Tento příkaz používá parametr časového limitu k omezení čekání na 120 sekund. Po vypršení doby se příkazový řádek vrátí, ale úloha se bude dál spouštět na pozadí.
Wait-Job -ID 10 -Timeout 120
Zastavení úlohy
Pokud chcete zastavit úlohu na pozadí, použijte rutinu Stop-Job
. Následující příkaz spustí úlohu, která získá každou položku v protokolu událostí systému. Uloží objekt úlohy do $job
proměnné.
$job = Start-Job -ScriptBlock {Get-EventLog -Log System}
Následující příkaz zastaví úlohu. Používá operátor kanálu (|
) k odeslání úlohy v $job
proměnné do Stop-Job
.
$job | Stop-Job
Odstranění úlohy
Pokud chcete odstranit úlohu na pozadí, použijte rutinu Remove-Job
. Následující příkaz odstraní úlohu v $job
proměnné.
Remove-Job -Job $job
Zkoumání neúspěšné úlohy
Úlohy můžou selhat z mnoha důvodů. objekt úlohy obsahuje vlastnost Reason , která obsahuje informace o příčině selhání.
Následující příklad spustí úlohu bez požadovaných přihlašovacích údajů.
$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:...
Zkontrolujte vlastnost Důvod a vyhledejte chybu, která způsobila selhání úlohy.
$job.ChildJobs[0].JobStateInfo.Reason
V tomto případě úloha selhala, protože vzdálený počítač k spuštění příkazu vyžadoval explicitní přihlašovací údaje. Vlastnost Reason obsahuje následující zprávu:
Připojení ke vzdálenému serveru se nezdařilo s následující chybovou zprávou: Přístup byl odepřen.