Sdílet prostřednictvím


O pracovních místech

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

Toto téma vysvětluje, jak spouštět úlohy na pozadí v prostředí PowerShell na místním počítači. Informace o spouštění úloh na pozadí ve vzdálených počítačích naleznete v části about_Remote_Jobs.

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

RUTINY ÚLOHY

cmdlet 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 není zobrazena jedna nebo všechny úlohy.
kompletní.
Remove-Job Odstraní úlohu na pozadí.
Invoke-Command Parametr AsJob spustí libovolný příkaz jako pozadí
úlohy na vzdáleném počítači. Můžete také použít
Invoke-Command pro vzdálené spuštění libovolného příkazu job,
včetně příkazu Start-Job.

JAK SPUSTIT ÚLOHU V MÍSTNÍM POČÍTAČI

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

Chcete-li napsat příkaz Start-Job, uzavřete příkaz, který úloha spouští, do složených závorek ( { } ). K určení 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}

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 poté jej použijte 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}

Rutinu Get-Job můžete také použít k získání objektů, které představují úlohy spuštěné v aktuální relaci. Get-Job Vrátí stejný objekt úlohy, který vrátí Start-Job.

ZÍSKÁVÁNÍ OBJEKTŮ ÚLOH

Chcete-li získat objekt, který představuje úlohy na pozadí, které byly spuštěny 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 ji 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 "Selhání". Úloha může být také blokovaná 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

Když spustíte úlohu na pozadí, výsledky se 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žívá rutinu Receive-Job k získání výsledků úlohy. 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 také uložit do souboru pomocí operátoru přesměrování (>) nebo rutiny Out-File. Následující příkaz používá operátor přesměrování k uložení výsledků úlohy do proměnné $job v souboru Results.txt.

Receive-Job -Job $job > results.txt

ZÍSKÁNÍ A UDRŽENÍ DÍLČÍCH VÝSLEDKŮ ZAKÁZKY

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 dosud vygenerované výsledky. Zbývající výsledky získáte opětovným spuštěním příkazů Receive-Job.

Když Receive-Job vrátí výsledky, ve výchozím nastavení tyto výsledky odstraní z mezipaměti, kde jsou uloženy výsledky úlohy. 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 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

Chcete-li zabránit Receive-Job odstranění vrácených výsledků úlohy, použijte parametr Keep . Výsledkem je, že vrátí všechny výsledky, Receive-Job 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č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 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 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ěna. Pokud byste k získání výsledků úlohy použili rutinu Receive-Job, výsledky by byly neúplné. K opakovanému získání všech výsledků můžete použít rutinu Receive-Job. Ve výchozím nastavení se při každém použití zobrazí pouze výsledky, které ještě nebyly přijaty, ale můžete použít parametr Keep rutiny Receive-Job k uchování výsledků, i když již byly přijaty.

Částečné výsledky můžete zapsat do souboru a poté připojit novější výsledky při jejich doručení, nebo můžete počkat a zkontrolovat stav úlohy později.

Můžete použít parametr Wait rutiny Receive-Job , který nevrátí příkazový řádek, dokud není úloha dokončena a nejsou 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 umožňuje počkat na určitou úlohu, na všechny úlohy nebo na dokončení kterékoli z úloh.

Následující příkaz pomocí rutiny Wait-Job počká 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

VYŠETŘOVÁNÍ NEÚSPĚŠNÉ ÚLOHY

Chcete-li zjistit, proč se úloha nezdařila, použijte podvlastnost 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č k spuštění příkazu vyžadoval explicitní přihlašovací údaje. Hodnota vlastnosti Reason je:

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

VIZ TAKÉ

o_práci_na_dálku

about_Job_Details

o_Vzdáleném

o_PSSessions

Spustit úlohu

Získat práci

Příjem úlohy

Zastavení-úlohy

Čekání na úlohu

odstranit úlohu

Invoke-Command (vyvolat příkaz)