Delen via


about_Jobs

Korte beschrijving

Biedt informatie over hoe PowerShell-achtergrondtaken een opdracht of expressie op de achtergrond uitvoeren zonder interactie met de huidige sessie.

Lange beschrijving

PowerShell voert gelijktijdig opdrachten en scripts uit via taken. PowerShell biedt drie taaktypen ter ondersteuning van gelijktijdigheid.

  • RemoteJob - Opdrachten en scripts worden uitgevoerd op een externe sessie. Zie about_Remote_Jobs voor meer informatie.
  • BackgroundJob - Opdrachten en scripts worden in een afzonderlijk proces op de lokale computer uitgevoerd.
  • PSTaskJob or ThreadJob - Opdrachten en scripts worden uitgevoerd in een afzonderlijke thread binnen hetzelfde proces op de lokale computer. Zie about_Thread_Jobs voor meer informatie.

Het extern uitvoeren van scripts, op een afzonderlijke computer of in een afzonderlijk proces, biedt een geweldige isolatie. Fouten die optreden in de externe taak hebben geen invloed op andere actieve taken of de bovenliggende sessie waarmee de taak is gestart. De externe laag voegt echter overhead toe, inclusief objectserialisatie. Alle objecten worden geserialiseerd en gedeserialiseerd wanneer ze worden doorgegeven tussen de bovenliggende sessie en de externe sessie (taak). Serialisatie van grote complexe gegevensobjecten kan grote hoeveelheden reken- en geheugenresources verbruiken en grote hoeveelheden gegevens overdragen via het netwerk.

Taken op basis van threads zijn niet zo robuust als externe taken en achtergrondtaken, omdat ze in hetzelfde proces op verschillende threads worden uitgevoerd. Als één taak een kritieke fout heeft waardoor het proces vastloopt, worden alle andere taken in het proces beëindigd.

Thread-taken vereisen echter minder overhead. Ze maken geen gebruik van de externe laag of serialisatie. De resultaatobjecten worden geretourneerd als verwijzingen naar live-objecten in de huidige sessie. Zonder deze overhead worden taken op basis van threads sneller uitgevoerd en gebruiken ze minder resources dan de andere taaktypen.

Belangrijk

De bovenliggende sessie waarmee de taak is gemaakt, bewaakt ook de taakstatus en verzamelt pijplijngegevens. Het onderliggende taakproces wordt beëindigd door het bovenliggende proces zodra de taak een voltooide status heeft bereikt. Als de bovenliggende sessie wordt beëindigd, worden alle actieve onderliggende taken samen met de onderliggende processen beëindigd.

Er zijn twee manieren om deze situatie te omzeilen:

  1. Gebruik Invoke-Command om taken te maken die worden uitgevoerd in niet-verbonden sessies. Zie about_Remote_Jobs voor meer informatie.
  2. Gebruik Start-Process om een nieuw proces te maken in plaats van een taak. Zie Proces starten voor meer informatie.

De taak-cmdlets

  • Start-Job - Start een achtergrondtaak op een lokale computer.
  • Get-Job - Haalt de achtergrondtaken op die in de huidige sessie zijn gestart.
  • Receive-Job - Haalt de resultaten van achtergrondtaken op.
  • Stop-Job - Hiermee wordt een achtergrondtaak gestopt.
  • Wait-Job - Onderdrukt de opdrachtprompt totdat een of alle taken zijn voltooid.
  • Remove-Job - Hiermee verwijdert u een achtergrondtaak.
  • Invoke-Command - Met de parameter AsJob maakt u een achtergrondtaak op een externe computer. U kunt gebruiken Invoke-Command om een taakopdracht op afstand uit te voeren, inclusief Start-Job.

Een taak starten op de lokale computer

Gebruik de Start-Job cmdlet om een achtergrondtaak op de lokale computer te starten.

Als u een Start-Job opdracht wilt schrijven, plaatst u de opdracht die de taak uitvoert tussen accolades ({}). Gebruik de parameter ScriptBlock om de opdracht op te geven.

Met de volgende opdracht wordt een achtergrondtaak gestart waarmee een Get-Process opdracht op de lokale computer wordt uitgevoerd.

Start-Job -ScriptBlock {Get-Process}

Wanneer u een achtergrondtaak start, wordt de opdrachtprompt onmiddellijk geretourneerd, zelfs als het langer duurt voordat de taak is voltooid. U kunt zonder onderbreking in de sessie blijven werken terwijl de taak wordt uitgevoerd.

De Start-Job opdracht retourneert een object dat de taak vertegenwoordigt. Het taakobject bevat nuttige informatie over de taak, maar bevat niet de taakresultaten.

U kunt het taakobject opslaan in een variabele en dit vervolgens gebruiken met de andere taak-cmdlets om de achtergrondtaak te beheren. Met de volgende opdracht wordt een taakobject gestart en wordt het resulterende taakobject opgeslagen in de $job variabele.

$job = Start-Job -ScriptBlock {Get-Process}

Vanaf PowerShell 6.0 kunt u de achtergrondoperator (&) aan het einde van een pijplijn gebruiken om een achtergrondtaak te starten. Zie achtergrondoperator voor meer informatie.

Het gebruik van de achtergrondoperator is functioneel equivalent aan het gebruik van de Start-Job cmdlet in het vorige voorbeeld.

$job = Get-Process &

Taakobjecten verkrijgen

De Get-Job cmdlet retourneert objecten die de achtergrondtaken vertegenwoordigen die in de huidige sessie zijn gestart. Zonder parameters worden Get-Job alle taken geretourneerd die in de huidige sessie zijn gestart.

Get-Job

Het taakobject bevat de status van de taak, die aangeeft of de taak is voltooid. Een voltooide taak heeft de status Voltooid of Mislukt. Een taak kan ook Geblokkeerd of Actief zijn.

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

U kunt het taakobject opslaan in een variabele en deze gebruiken om de taak in een latere opdracht weer te geven. Met de volgende opdracht wordt de taak met id 1 opgehaald en opgeslagen in de $job variabele.

$job = Get-Job -Id 1

De resultaten van een taak ophalen

Wanneer u een achtergrondtaak uitvoert, worden de resultaten niet onmiddellijk weergegeven. Gebruik de cmdlet om de resultaten van een achtergrondtaak op te Receive-Job halen.

In het volgende voorbeeld haalt de Receive-Job cmdlet de resultaten van de taak op met behulp van het taakobject in de $job variabele.

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

U kunt de resultaten van een taak opslaan in een variabele. Met de volgende opdracht worden de resultaten van de taak in de $job variabele opgeslagen in de $results variabele.

$results = Receive-Job -Job $job

Gedeeltelijke taakresultaten ophalen en bewaren

De Receive-Job cmdlet haalt de resultaten van een achtergrondtaak op. Als de taak is voltooid, Receive-Job worden alle taakresultaten opgehaald. Als de taak nog steeds wordt uitgevoerd, Receive-Job worden de resultaten opgehaald die tot nu toe zijn gegenereerd. U kunt opdrachten opnieuw uitvoeren Receive-Job om de resterende resultaten op te halen.

De resultaten worden standaard Receive-Job verwijderd uit de cache waarin taakresultaten worden opgeslagen. Wanneer u opnieuw uitvoert Receive-Job , krijgt u alleen de nieuwe resultaten die na de eerste uitvoering zijn ontvangen.

De volgende opdrachten tonen de resultaten van Receive-Job opdrachten die worden uitgevoerd voordat de taak is voltooid.

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

Gebruik de parameter Keep om te voorkomen dat Receive-Job de geretourneerde taakresultaten worden verwijderd. De volgende opdrachten laten zien wat het effect is van het gebruik van de parameter Keep op een taak die nog niet is voltooid.

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

Wachten op de resultaten

Als u een opdracht uitvoert die lang duurt, kunt u de eigenschappen van het taakobject gebruiken om te bepalen wanneer de taak is voltooid. Met de volgende opdracht wordt het Get-Job -object gebruikt om alle achtergrondtaken in de huidige sessie op te halen.

Get-Job

De resultaten worden weergegeven in een tabel. De status van de taak wordt weergegeven in de kolom Status .

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

In dit geval geeft de eigenschap State aan dat taak 2 nog steeds wordt uitgevoerd. Als u de Receive-Job cmdlet nu zou gebruiken om de taakresultaten op te halen, zouden de resultaten onvolledig zijn. U kunt de Receive-Job cmdlet herhaaldelijk gebruiken om alle resultaten op te halen. Gebruik de eigenschap State om te bepalen wanneer de taak is voltooid.

U kunt ook de parameter Wait van de Receive-Job cmdlet gebruiken. Wanneer u deze parameter gebruikt, retourneert de cmdlet de opdrachtprompt pas als de taak is voltooid en alle resultaten beschikbaar zijn.

U kunt ook de Wait-Job cmdlet gebruiken om te wachten op een of alle resultaten van de taak. Wait-Job hiermee kunt u wachten op een of meer specifieke taken of op alle taken. Met de volgende opdracht wordt de Wait-Job cmdlet gebruikt om te wachten op een taak met id 10.

Wait-Job -ID 10

Als gevolg hiervan wordt de PowerShell-prompt onderdrukt totdat de taak is voltooid.

U kunt ook wachten op een vooraf bepaalde periode. Deze opdracht gebruikt de time-outparameter om het wachten te beperken tot 120 seconden. Wanneer de tijd is verstreken, wordt de opdrachtprompt geretourneerd, maar blijft de taak op de achtergrond worden uitgevoerd.

Wait-Job -ID 10 -Timeout 120

Een taak stoppen

Gebruik de Stop-Job cmdlet om een achtergrondtaak te stoppen. Met de volgende opdracht wordt een taak gestart om elke vermelding in het gebeurtenislogboek van het systeem op te halen. Het taakobject wordt opgeslagen in de $job variabele.

$job = Start-Job -ScriptBlock {Get-EventLog -Log System}

Met de volgende opdracht wordt de taak gestopt. Er wordt een pijplijnoperator (|) gebruikt om de taak in de $job variabele naar te Stop-Jobverzenden.

$job | Stop-Job

Een taak verwijderen

Gebruik de Remove-Job cmdlet om een achtergrondtaak te verwijderen. Met de volgende opdracht wordt de taak in de $job variabele verwijderd.

Remove-Job -Job $job

Een mislukte taak onderzoeken

Taken kunnen om verschillende redenen mislukken. het taakobject bevat een redeneigenschap die informatie bevat over de oorzaak van de fout.

In het volgende voorbeeld wordt een taak gestart zonder de vereiste referenties.

$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:...

Inspecteer de eigenschap Reason om de fout te vinden waardoor de taak is mislukt.

$job.ChildJobs[0].JobStateInfo.Reason

In dit geval is de taak mislukt omdat de externe computer expliciete referenties nodig had om de opdracht uit te voeren. De eigenschap Reason bevat het volgende bericht:

Verbinding maken met externe server is mislukt met het volgende foutbericht: 'Toegang is geweigerd'.

Zie ook