Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 naleznete v tématu about_Remote_Jobs. -
BackgroundJob– Příkazy a skripty se spouštějí v samostatném procesu na místním počítači. -
PSTaskJobneboThreadJob– 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 naleznete 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:
- Pomocí
Invoke-Commandmůžete vytvářet úlohy, které se spouštějí v odpojených relacích. Další informace najdete v tématu about_Remote_Jobs. - Místo úlohy použijte
Start-Processk vytvoření nového procesu. Další informace najdete 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í. PomocíInvoke-Commandmůžete vzdáleně spustit libovolný příkaz ú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 příkaz Start-Job, 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á na místním počítači spustí příkaz Get-Process.
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 proměnné $job.
$job = Start-Job -ScriptBlock {Get-Process}
Počínaje PowerShellem 6.0 můžete spustit úlohu na pozadí pomocí operátoru 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í rutiny Start-Job 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čit 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 proměnné $job.
$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.
V následujícím příkladu rutina Receive-Job získá výsledky úlohy pomocí objektu úlohy v proměnné $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
...
Výsledky úlohy můžete uložit do proměnné. Následující příkaz uloží výsledky úlohy do proměnné $job do proměnné $results.
$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á výsledky, které byly dosud vygenerovány. Zbývající výsledky získáte opětovným spuštěním příkazů Receive-Job.
Ve výchozím nastavení Receive-Job odstraní výsledky z mezipaměti, ve které jsou uloženy výsledky úloh. Když znovu spustíte 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 Receive-Job příkazů, které se spustí 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 odstranění vrácených výsledků úlohy Receive-Job. Následující příkazy ukazují účinek použití parametru Keep u úlohy, 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 používá objekt Get-Job k získání všech úloh na pozadí v aktuální relaci.
Get-Job
Výsledky se zobrazí v tabulce. Stav úlohy se zobrazí ve sloupci State.
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 k získání výsledků úlohy použili rutinu Receive-Job, 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 Receive-Job -Wait příkaz. Když použijete tento parametr, rutina nevrátí příkazový řádek, dokud se úloha nedokončí a nebudou k dispozici všechny výsledky.
Můžete také použít rutinu Wait-Job a čekat na všechny výsledky úlohy nebo na všechny výsledky úlohy.
Wait-Job vám umožní počkat na jednu nebo více konkrétních úloh nebo na 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 timeout 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 proměnné $job.
$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 proměnné $job 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 proměnné $job.
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 Reason 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.
Viz také
- about_Job_Details
- about_PSSessions
- about_Remote
- about_Remote_Jobs
- about_Thread_Jobs
- Invoke-Command
- get-job
- úlohy příjmu
- odebrání úlohy
- zahájení úlohy
- stop-job
- wait-job