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.