Delen via


Over taken

KORTE BESCHRIJVING

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

LANGE BESCHRIJVING

In dit onderwerp wordt uitgelegd hoe u achtergrondtaken uitvoert in PowerShell op een lokale computer. Zie about_Remote_Jobs voor informatie over het uitvoeren van achtergrondtaken op externe computers.

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 TAAK-CMDLETS

Cmdlet Beschrijving
Start-Job Hiermee start u een achtergrondtaak op een lokale computer.
Get-Job Hiermee haalt u de achtergrondtaken op die zijn gestart in de
huidige sessie.
Receive-Job Hiermee worden de resultaten van achtergrondtaken opgehaald.
Stop-Job Hiermee stopt u een achtergrondtaak.
Wait-Job Onderdrukt de opdrachtprompt totdat een of alle taken zijn
Volledige.
Remove-Job Hiermee verwijdert u een achtergrondtaak.
Invoke-Command Met de parameter AsJob wordt elke opdracht als achtergrond uitgevoerd
op een externe computer. U kunt ook
Invoke-Command om een taakopdracht op afstand uit te voeren,
inclusief een Start-Job opdracht.

EEN TAAK STARTEN OP DE LOKALE COMPUTER

Als u een achtergrondtaak op de lokale computer wilt starten, gebruikt u de cmdlet Start-Job.

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}

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

Sla het taakobject op in een variabele en gebruik het vervolgens 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 variabele $job.

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

U kunt de Get-Job cmdlet ook gebruiken om objecten op te halen die de taken vertegenwoordigen die in de huidige sessie zijn gestart. Get-Job retourneert hetzelfde taakobject dat Start-Job retourneert.

TAAKOBJECTEN VERKRIJGEN

Gebruik de cmdlet om het Get-Job object op te halen dat de achtergrondtaken vertegenwoordigt die in de huidige sessie zijn gestart. Zonder parameters worden Get-Job alle taken geretourneerd die in de huidige sessie zijn gestart.

Met de volgende opdracht worden bijvoorbeeld de taken in de huidige sessie opgeslagen.

PS C:> Get-Job

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

U kunt het taakobject ook 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 variabele $job.

$job = Get-Job -Id 1

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 worden geblokkeerd of uitgevoerd.

Get-Job

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

DE RESULTATEN VAN EEN TAAK OPHALEN

Wanneer u een achtergrondtaak uitvoert, worden de resultaten niet onmiddellijk weergegeven. In plaats daarvan retourneert de cmdlet Start-Job een taakobject dat de taak vertegenwoordigt, maar niet de resultaten. Gebruik de cmdlet om de resultaten van een achtergrondtaak op te Receive-Job halen.

Met de volgende opdracht wordt de Receive-Job cmdlet gebruikt om de resultaten van de taak op te halen. Er wordt een taakobject gebruikt dat is opgeslagen in de variabele $job om de taak te identificeren.

Receive-Job -Job $job

De cmdlet Receive-Job retourneert de resultaten van de taak.

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 ook opslaan in een variabele. Met de volgende opdracht worden de resultaten van de taak opgeslagen in de variabele $job in de variabele $results.

$results = Receive-Job -Job $job

En u kunt de resultaten van de taak opslaan in een bestand met behulp van de omleidingsoperator (>) of de cmdlet Out-File. Met de volgende opdracht wordt de omleidingsoperator gebruikt om de resultaten van de taak op te slaan in de variabele $job in het Results.txt-bestand.

Receive-Job -Job $job > results.txt

GEDEELTELIJKE TAAKRESULTATEN OPHALEN EN BEWAREN

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

Wanneer Receive-Job resultaten worden geretourneerd, worden deze resultaten standaard verwijderd uit de cache waarin de taakresultaten worden opgeslagen. Als u een andere Receive-Job opdracht uitvoert, krijgt u alleen de resultaten die nog niet 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

Als u wilt voorkomen dat Receive-Job de geretourneerde taakresultaten worden verwijderd, gebruikt u de parameter Keep . Als gevolg hiervan Receive-Job worden alle resultaten geretourneerd die tot dat moment zijn gegenereerd.

De volgende opdrachten tonen het effect 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. Standaard krijgt u telkens wanneer u deze gebruikt alleen de resultaten die nog niet zijn ontvangen, maar u kunt de parameter Keep van de cmdlet Receive-Job gebruiken om de resultaten te behouden, ook al zijn ze al ontvangen.

U kunt de gedeeltelijke resultaten naar een bestand schrijven en nieuwere resultaten toevoegen wanneer ze binnenkomen of u kunt wachten en de status van de taak later controleren.

U kunt de parameter Wait van de Receive-Job cmdlet gebruiken, die de opdrachtprompt niet retourneert totdat 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 bepaalde taak, op alle taken of op een van de taken die moeten worden voltooid.

Met de volgende opdracht wordt de cmdlet Wait-Job 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 systeemlogboek op te halen. Hiermee wordt het taakobject opgeslagen in de variabele $job.

$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 variabele $job te verzenden naar Stop-Job.

$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 variabele $job verwijderd.

Remove-Job -Job $job

EEN MISLUKTE TAAK ONDERZOEKEN

Als u wilt achterhalen waarom een taak is mislukt, gebruikt u de subproperty Reason van het taakobject.

Met de volgende opdracht wordt een taak gestart zonder de vereiste referenties. Hiermee wordt het taakobject opgeslagen in de variabele $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:...

De volgende opdracht gebruikt 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 waarde van de eigenschap Reason is:

Verbinding maken met externe server is mislukt met het volgende foutbericht: De toegang is geweigerd.

ZIE OOK

about_Remote_Jobs

about_Job_Details

about_Remote

about_PSSessions

Start-Job

Get-Job

Receive-Job

Stop-Job

Wait-Job

Remove-Job

Invoke-opdracht