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 nebo ThreadJob – 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:

  1. 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.
  2. 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žít Invoke-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 . Když 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í se vzdáleným serverem selhala s následující chybovou zprávou: Přístup byl odepřen.

Viz také