Delen via


about_Job_Details

Korte beschrijving

Biedt informatie over achtergrondtaken op lokale en externe computers.

Gedetailleerde beschrijving

In dit onderwerp wordt het concept van een achtergrondtaak uitgelegd en vindt u technische informatie over de werking van achtergrondtaken in PowerShell.

Dit onderwerp is een aanvulling op de onderwerpen about_Jobs, about_Thread_Jobs en about_Remote_Jobs .

Achtergrondtaken

Een achtergrondtaak voert een opdracht of expressie asynchroon uit. Het kan een cmdlet, een functie, een script of een andere op opdrachten gebaseerde taak uitvoeren. Het is ontworpen om opdrachten uit te voeren die een langere periode duren, maar u kunt het gebruiken om elke opdracht op de achtergrond uit te voeren.

Wanneer een synchrone opdracht wordt uitgevoerd, wordt de PowerShell-opdrachtprompt onderdrukt totdat de opdracht is voltooid. Maar een achtergrondtaak onderdrukt de PowerShell-prompt niet. Een opdracht voor het starten van een achtergrondtaak retourneert een taakobject. De prompt wordt onmiddellijk geretourneerd, zodat u aan andere taken kunt werken terwijl de achtergrondtaak wordt uitgevoerd.

Wanneer u echter een achtergrondtaak start, krijgt u de resultaten niet onmiddellijk, zelfs niet als de taak zeer snel wordt uitgevoerd. Het taakobject dat wordt geretourneerd, bevat nuttige informatie over de taak, maar bevat niet de taakresultaten. U moet een afzonderlijke opdracht uitvoeren om de taakresultaten op te halen. U kunt ook opdrachten uitvoeren om de taak te stoppen, te wachten tot de taak is voltooid en om de taak te verwijderen.

Als u de timing van een achtergrondtaak onafhankelijk wilt maken van andere opdrachten, wordt elke achtergrondtaak uitgevoerd in een eigen PowerShell-sessie. Dit kan echter een tijdelijke verbinding zijn die alleen wordt gemaakt om de taak uit te voeren en vervolgens wordt vernietigd, of het kan een permanente PSSession zijn die u kunt gebruiken om verschillende gerelateerde taken of opdrachten uit te voeren.

De taak-cmdlets gebruiken

Gebruik een Start-Job opdracht om een achtergrondtaak op een lokale computer te starten. Start-Job retourneert een taakobject. U kunt ook objecten ophalen die de taken vertegenwoordigen die zijn gestart op de lokale computer met behulp van de Get-Job cmdlet.

Gebruik een Receive-Job opdracht om de taakresultaten op te halen. Als de taak niet is voltooid, Receive-Job retourneert gedeeltelijke resultaten. U kunt de Wait-Job cmdlet ook gebruiken om de opdrachtprompt te onderdrukken totdat een of alle taken die in de sessie zijn gestart, zijn voltooid.

Gebruik de Stop-Job cmdlet om een achtergrondtaak te stoppen. Gebruik de Remove-Job cmdlet om een taak te verwijderen.

Zie het Help-onderwerp voor elke cmdlet en zie about_Jobs voor meer informatie over de werking van de cmdlets.

Achtergrondtaken op externe computers starten

U kunt achtergrondtaken maken en beheren op een lokale of externe computer. Als u een achtergrondtaak op afstand wilt uitvoeren, gebruikt u de parameter AsJob van een cmdlet zoals Invoke-Command, of gebruikt u de Invoke-Command cmdlet om een Start-Job opdracht op afstand uit te voeren. U kunt ook een achtergrondtaak starten in een interactieve sessie.

Zie about_Remote_Jobs voor meer informatie over externe achtergrondtaken.

Onderliggende taken

Elke achtergrondtaak bestaat uit een bovenliggende taak en een of meer onderliggende taken. In taken die zijn gestart met Start-Job of de asjob-parameter van Invoke-Command, is de bovenliggende taak een leidinggevende. Er worden geen opdrachten uitgevoerd en er worden geen resultaten geretourneerd. De opdrachten worden daadwerkelijk uitgevoerd door de onderliggende taken. Taken die andere cmdlets gebruiken, werken mogelijk anders.

De onderliggende taken worden opgeslagen in de eigenschap ChildJobs van het bovenliggende taakobject. De eigenschap ChildJobs kan een of meer onderliggende taakobjecten bevatten. De onderliggende taakobjecten hebben een Naam, ID en InstanceId die verschillen van de bovenliggende taak, zodat u de bovenliggende en onderliggende taken afzonderlijk of als een eenheid kunt beheren.

Als u de bovenliggende en onderliggende taken van een taak wilt ophalen, gebruikt u de parameter IncludeChildJobs van de Get-Job cmdlet. De parameter IncludeChildJob is geïntroduceerd in Windows PowerShell 3.0.

PS> Get-Job -IncludeChildJob

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
1  Job1   RemoteJob     Failed     True          localhost   Get-Process
2  Job2                 Completed  True          Server01    Get-Process
3  Job3                 Failed     False         localhost   Get-Process

Als u de bovenliggende taak en alleen de onderliggende taken met een bepaalde statuswaarde wilt ophalen, gebruikt u de parameter ChildJobState van de Get-Job cmdlet. De parameter ChildJobState is geïntroduceerd in Windows PowerShell 3.0.

PS> Get-Job -ChildJobState Failed

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
1  Job1   RemoteJob     Failed     True          localhost   Get-Process
3  Job3                 Failed     False         localhost   Get-Process

Als u de onderliggende taken van een taak in alle versies van PowerShell wilt ophalen, gebruikt u de eigenschap ChildJob van de bovenliggende taak.

PS> (Get-Job Job1).ChildJobs

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
2  Job2                 Completed  True          Server01    Get-Process
3  Job3                 Failed     False         localhost   Get-Process

U kunt ook een Get-Job opdracht gebruiken voor de onderliggende taak, zoals wordt weergegeven in de volgende opdracht:

PS> Get-Job Job3

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
3  Job3                 Failed     False         localhost   Get-Process

De configuratie van de onderliggende taak is afhankelijk van de opdracht die u gebruikt om de taak te starten.

  • Wanneer u gebruikt Start-Job om een taak op een lokale computer te starten, bestaat de taak uit een bovenliggende leidinggevende taak en een onderliggende taak waarmee de opdracht wordt uitgevoerd.

  • Wanneer u de parameter AsJob van Invoke-Command gebruikt om een taak op een of meer computers te starten, bestaat de taak uit een bovenliggende taak voor leidinggevenden en een onderliggende taak voor elke taak die op elke computer wordt uitgevoerd.

  • Wanneer u gebruikt Invoke-Command om een Start-Job opdracht uit te voeren op een of meer externe computers, is het resultaat hetzelfde als een lokale opdracht die op elke externe computer wordt uitgevoerd. De opdracht retourneert een taakobject voor elke computer. Het taakobject bestaat uit een uitvoerende bovenliggende taak en één onderliggende taak waarmee de opdracht wordt uitgevoerd.

De bovenliggende taak vertegenwoordigt alle onderliggende taken. Wanneer u een bovenliggende taak beheert, beheert u ook de bijbehorende onderliggende taken. Als u bijvoorbeeld een bovenliggende taak stopt, worden alle onderliggende taken gestopt. Als u de resultaten van een bovenliggende taak krijgt, krijgt u de resultaten van alle onderliggende taken.

U kunt onderliggende taken echter ook afzonderlijk beheren. Dit is het meest handig als u een probleem met een taak wilt onderzoeken of de resultaten wilt ophalen van slechts een van een aantal onderliggende taken die zijn gestart met de AsJob-parameter van Invoke-Command.

Met de volgende opdracht wordt de parameter AsJob van Invoke-Command gebruikt om achtergrondtaken te starten op de lokale computer en twee externe computers. Met de opdracht wordt de taak opgeslagen in de $j variabele.

PS> $j = Invoke-Command -ComputerName localhost, Server01, Server02 `
-Command {Get-Date} -AsJob

Wanneer u de eigenschappen Name en ChildJob van de taak in $jweergeeft, ziet u dat de opdracht een taakobject heeft geretourneerd met drie onderliggende taken, één voor elke computer.

PS> $j | Format-List Name, ChildJobs

Name      : Job3
ChildJobs : {Job4, Job5, Job6}

Wanneer u de bovenliggende taak weergeeft, wordt weergegeven dat de taak is mislukt.

PS> $j

Id Name   PSJobTypeName State      HasMoreData   Location
-- ----   ------------- -----      -----------   --------
3  Job3   RemotingJob   Failed     False         localhost,Server...

Maar wanneer u een Get-Job opdracht uitvoert waarmee de onderliggende taken worden opgevraagd, ziet u in de uitvoer dat slechts één onderliggende taak is mislukt.

PS> Get-Job -IncludeChildJobs

Id  Name   PSJobTypeName State      HasMoreData   Location    Command
--  ----   ------------- -----      -----------   --------    -------
3   Job3   RemotingJob   Failed     False         localhost,Server...
4   Job4                 Completed  True          localhost   Get-Date
5   Job5                 Failed     False         Server01    Get-Date
6   Job6                 Completed  True          Server02    Get-Date

Als u de resultaten van alle onderliggende taken wilt ophalen, gebruikt u de Receive-Job cmdlet om de resultaten van de bovenliggende taak op te halen. Maar u kunt ook de resultaten van een bepaalde onderliggende taak krijgen, zoals wordt weergegeven in de volgende opdracht.

PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName,
>> DateTime -AutoSize
ComputerName DateTime
------------ --------
Server02     Thursday, March 13, 2008 4:16:03 PM

Met de functie onderliggende taken van PowerShell-achtergrondtaken hebt u meer controle over de taken die u uitvoert.

Jobtypen

PowerShell ondersteunt verschillende soorten taken voor verschillende taken. Vanaf Windows PowerShell 3.0 kunnen ontwikkelaars 'taakbronadapters' schrijven die nieuwe taaktypen toevoegen aan PowerShell en de taakbronadapters in modules opnemen. Wanneer u de module importeert, kunt u het nieuwe taaktype in uw sessie gebruiken.

De module PSScheduledJob voegt bijvoorbeeld geplande taken toe en de module PSWorkflow voegt werkstroomtaken toe.

Aangepaste taaktypen kunnen aanzienlijk verschillen van standaard PowerShell-achtergrondtaken. Geplande taken worden bijvoorbeeld op schijf opgeslagen; ze bestaan niet alleen in een bepaalde sessie. Werkstroomtaken kunnen worden onderbroken en hervat.

De cmdlets die u gebruikt om aangepaste taken te beheren, zijn afhankelijk van het taaktype. Voor sommige gebruikt u de standaardtaak-cmdlets, zoals Get-Job en Start-Job. Andere worden geleverd met gespecialiseerde cmdlets die alleen een bepaald type taak beheren. Zie de Help-onderwerpen over het taaktype voor gedetailleerde informatie over aangepaste taaktypen.

Gebruik Get-Job de cmdlet om het taaktype van een taak te vinden. Get-Job retourneert verschillende taakobjecten voor verschillende soorten taken. De waarde van de eigenschap PSJobTypeName van de taakobjecten die Get-Job retourneert, geeft het taaktype aan.

De volgende tabel bevat de taaktypen die bij PowerShell worden geleverd.

Taaktype Description
Achtergrondtaak Begonnen met het gebruik van de Start-Job cmdlet.
RemoteJob Begonnen met de parameter AsJob van de
Invoke-Command Cmdlet.
PSWorkflowJob Begonnen met het gebruik van de parameter AsJob van een werkstroom.
PSScheduledJob Een exemplaar van een geplande taak die is gestart door een taaktrigger.
CIMJob Begonnen met het gebruik van de parameter AsJob van een cmdlet van een
CDXML-module.
WMIJob Begonnen met het gebruik van de parameter AsJob van een cmdlet van een
WMI-module.
PSEventJob Gemaakt metRegister-ObjectEvent en opgeven van een
actie met de parameter Actie .

OPMERKING: Voordat u de Get-Job cmdlet gebruikt om taken van een bepaald type op te halen, controleert u of de module waarmee het taaktype wordt toegevoegd, is geïmporteerd in de huidige sessie. Get-Job Anders krijgt u geen taken van dat type.

Voorbeelden

Met de volgende opdrachten maakt u een lokale achtergrondtaak, een externe achtergrondtaak, een werkstroomtaak en een geplande taak. Vervolgens wordt de Get-Job cmdlet gebruikt om de taken op te halen. Get-Job haalt de geplande taak niet op, maar krijgt alle gestarte exemplaren van de geplande taak.

Start een achtergrondtaak op de lokale computer.

PS> Start-Job -Name LocalData {Get-Process}

Id Name        PSJobTypeName   State   HasMoreData   Location   Command
-- ----        -------------   -----   -----------   --------   -------
2  LocalData   BackgroundJob   Running        True   localhost  Get-Process

Start een achtergrondtaak die wordt uitgevoerd op een externe computer.

PS> Invoke-Command -ComputerName Server01 {Get-Process} `
-AsJob -JobName RemoteData

Id  Name        PSJobTypeName  State   HasMoreData   Location   Command
--  ----        -------------  -----   -----------   --------   -------
2   RemoteData  RemoteJob      Running        True   Server01   Get-Process

een geplande taak Creatie

PS>  Register-ScheduledJob -Name ScheduledJob -ScriptBlock `
 {Get-Process} -Trigger (New-JobTrigger -Once -At "3 PM")

Id         Name            JobTriggers     Command       Enabled
--         ----            -----------     -------       -------
1          ScheduledJob    1               Get-Process   True

Creatie een werkstroom.

PS> workflow Test-Workflow {Get-Process}

Voer de werkstroom uit als een taak.


PS> Test-Workflow -AsJob -JobName TestWFJob

Id  Name       PSJobTypeName   State   HasMoreData   Location   Command
--  ----       -------------   -----   -----------   --------   -------
2   TestWFJob  PSWorkflowJob   NotStarted     True   localhost  Get-Process

Haal de baantjes. Met de Get-Job opdracht worden geen geplande taken opgeslagen, maar worden exemplaren van de geplande taak die worden gestart, opgeslagen.

PS> Get-Job

Id  Name         PSJobTypeName  State     HasMoreData  Location  Command
--  ----         -------------  -----     -----------  --------  -------
2   LocalData    BackgroundJob  Completed True         localhost Get-Process
4   RemoteData   RemoteJob      Completed True         Server01  Get-Process
6   TestWFJob    PSWorkflowJob  Completed True         localhost WorkflowJob
8   ScheduledJob PSScheduledJob Completed True         localhost Get-Process

Gebruik de Get-ScheduledJob cmdlet om geplande taken op te halen.

PS> Get-ScheduledJob

Id         Name            JobTriggers     Command       Enabled
--         ----            -----------     -------       -------
1          ScheduledJob    1               Get-Process   True

Zie ook