Sdílet prostřednictvím


O úlohách

STRUČNÝ POPIS

Poskytuje informace o tom, jak úlohy PowerShellu na pozadí spouští příkaz nebo výraz na pozadí bez interakce s aktuální relací.

DLOUHÝ POPIS

Toto téma vysvětluje, jak spouštět úlohy na pozadí v PowerShellu na místním počítači. Informace o spouštění úloh na pozadí ve vzdálených počítačích najdete v tématu about_Remote_Jobs.

Když spustíte úlohu na pozadí, příkazový řádek se okamžitě vrátí, i když dokončení úlohy trvá delší dobu. Během běhu úlohy můžete pokračovat v práci v relaci bez přerušení.

RUTINY ÚLOHY

Rutina Popis
Start-Job Spustí úlohu na pozadí v místním počítači.
Get-Job Získá úlohy na pozadí, které byly spuštěny v
aktuální relace.
Receive-Job Získá výsledky úloh na pozadí.
Stop-Job Zastaví úlohu na pozadí.
Wait-Job Potlačí příkazový řádek, dokud nebude jedna nebo všechny úlohy
Kompletní.
Remove-Job Odstraní úlohu na pozadí.
Invoke-Command Parametr AsJob spustí libovolný příkaz jako pozadí.
na vzdáleném počítači. Můžete také použít
Invoke-Command ke vzdálenému spuštění libovolného příkazu úlohy,
včetně Start-Job příkazu.

SPUŠTĚNÍ ÚLOHY V MÍSTNÍM POČÍTAČI

Pokud chcete spustit úlohu na pozadí v místním počítači, použijte rutinu Start-Job.

Pokud chcete napsat příkaz Start-Job, uzavřete příkaz, který úloha spustí ve složených závorkách ( { } ). Pomocí parametru ScriptBlock zadejte příkaz .

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}

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.

Uložte objekt úlohy do proměnné a pak ho použijte spolu 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}

Pomocí rutiny Get-Job můžete také získat objekty, které představují úlohy spuštěné v aktuální relaci. Get-Job vrátí stejný objekt úlohy, který Start-Job vrátí.

ZÍSKÁNÍ OBJEKTŮ ÚLOHY

K získání objektu, který představuje úlohy na pozadí spuštěné v aktuální relaci, použijte rutinu Get-Job . Bez parametrů Get-Job vrátí všechny úlohy, které byly spuštěny v aktuální relaci.

Například následující příkaz získá úlohy v aktuální relaci.

PS C:> Get-Job

Id  Name  PSJobTypeName State      HasMoreData  Location   Command
--  ----  ------------- -----      -----------  --------   -------
1   Job1  BackgroundJob Running    True         localhost  Get-Process

Objekt úlohy můžete také 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

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é zablokovaná nebo spuštěná.

Get-Job

Id  Name  PSJobTypeName State      HasMoreData  Location   Command
--  ----  ------------- -----      -----------  --------   -------
1   Job1  BackgroundJob Complete   True         localhost  Get-Process

ZÍSKÁNÍ VÝSLEDKŮ ÚLOHY

Při spuštění úlohy na pozadí se výsledky nezobrazí okamžitě. Místo toho rutina Start-Job vrátí objekt úlohy, který představuje úlohu, ale neobsahuje výsledky. Pokud chcete získat výsledky úlohy na pozadí, použijte rutinu Receive-Job .

Následující příkaz použije Receive-Job k získání výsledků úlohy rutinu . K identifikaci úlohy používá objekt úlohy uložený v proměnné $job.

Receive-Job -Job $job

Rutina Receive-Job vrátí výsledky úlohy.

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 také uložit do proměnné. Následující příkaz uloží výsledky úlohy v proměnné $job do proměnné $results.

$results = Receive-Job -Job $job

Výsledky úlohy můžete uložit do souboru pomocí operátoru přesměrování (>) nebo rutiny Out-File. Následující příkaz pomocí operátoru přesměrování uloží výsledky úlohy do proměnné $job v souboru Results.txt.

Receive-Job -Job $job > results.txt

ZÍSKÁNÍ A ZACHOVÁ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á, získá Receive-Job výsledky, které byly dosud vygenerovány. Zbývající výsledky získáte opětovným spuštěním Receive-Job příkazů.

Když Receive-Job vrátí výsledky, ve výchozím nastavení tyto výsledky odstraní z mezipaměti, ve které jsou výsledky úlohy uložené. Pokud spustíte jiný Receive-Job příkaz, získáte pouze výsledky, které ještě nebyly přijaty.

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

Pokud chcete zabránit Receive-Job odstranění vrácených výsledků úlohy, použijte parametr Keep . V důsledku toho Receive-Job vrátí všechny výsledky, které byly do té doby vygenerovány.

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 se úloha dokončí. Následující příkaz použije objekt k Get-Job 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ě 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 , byly by výsledky neúplné. K získání všech výsledků můžete opakovaně použít Receive-Job rutinu . Ve výchozím nastavení pokaždé, když ho použijete, získáte pouze ty výsledky, které ještě nebyly přijaty, ale můžete použít parametr Keep rutiny Receive-Job k zachování výsledků, i když už byly přijaty.

Částečné výsledky můžete zapsat do souboru a pak přidávat novější výsledky hned, jak dorazí, nebo můžete počkat a zkontrolovat stav úlohy později.

Můžete použít parametr Wait rutiny Receive-Job , který 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 některý nebo všechny výsledky úlohy. Wait-Job umožňuje počkat na určitou úlohu, na všechny úlohy nebo na některou z úloh, které se mají dokončit.

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čuje.

Můžete také čekat na předem stanovenou dobu. 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 bude dál běžet 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á všechny položky 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 úlohu zastaví. Pomocí operátoru kanálu (|) odešle úlohu 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

Pokud chcete zjistit, proč úloha selhala, použijte dílčí vlastnost Reason objektu úlohy.

Následující příkaz spustí úlohu bez požadovaných přihlašovacích údajů. Uloží objekt úlohy do proměnné $job.

$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}

Id Name  PSJobTypeName State  HasMoreData  Location  Command
-- ----  ------------- -----  -----------  --------  -------
1  Job1  BackgroundJob Failed False        localhost New-Item -Path HKLM:...

Následující příkaz používá vlastnost Reason k vyhledání chyby, která způsobila selhání úlohy.

$job.ChildJobs[0].JobStateInfo.Reason

V tomto případě úloha selhala, protože vzdálený počítač vyžadoval explicitní přihlašovací údaje ke spuštění příkazu. Hodnota vlastnosti Reason je:

Připojení ke vzdálenému serveru selhalo s následující chybovou zprávou: Přístup byl odepřen.

VIZ TAKÉ

about_Remote_Jobs

about_Job_Details

about_Remote

about_PSSessions

Start-Job

Get-Job

Receive-Job

Stop-Job

Wait-Job

Remove-Job

Invoke-Command