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ě ve stejném 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. Jakékoli chyby, ke kterým dochází ve vzdálené úloze, nemají vliv na jiné spuštěné úlohy nebo 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 ukončí, ukončí se všechny ostatní úlohy v procesu.

Ú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, které běží 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ří úlohu na pozadí na vzdáleném počítači. 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 na 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 okamžitě vrátí, 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 pozadí (&) na konci kanálu. Další informace najdete 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 byla úloha dokončena. Dokončená úloha má stav Dokončeno nebo Neúspěšné. Úloha může být také blokována nebo spuštěna.

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 do $job proměnné $results do 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á výsledky, které byly dosud generovány. Pokud chcete získat zbývající výsledky, můžete příkazy spustit Receive-Job znovu.

Ve výchozím nastavení odstraní výsledky z mezipaměti, Receive-Job ve které jsou uloženy výsledky úlohy. Po opětovném spuštění Receive-Job se zobrazí jenom nové výsledky, které přišly po prvním spuštění.

Následující příkazy zobrazují výsledky Receive-Job spuštění příkazů 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

Pokud chcete zabránit odstranění vrácených výsledků úlohy, použijte Receive-Job parametr Keep. Následující příkazy ukazují účinek použití parametru Keep u úlohy, která ještě není dokončena.

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žije Get-Job objekt 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 Stav .

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ě state vlastnost zjistí, že úloha 2 je stále spuštěna. Pokud byste teď k získání výsledků úlohy použili Receive-Job rutinu, výsledky by byly neúplné. Rutinu Receive-Job můžete použít opakovaně k získání všech výsledků. Pomocí vlastnosti State určete, kdy je úloha dokončena.

Můžete také použít parametr Wait rutiny Receive-Job . Při použití tohoto parametru rutina nevrací 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 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čila.

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. Když vyprší čas, příkazový řádek se 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 Důvod , 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 takovém 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 selhalo s následující chybovou zprávou: Přístup byl odepřen.

Viz také