about_Job_Details

Korte beschrijving

Hier vindt u 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 hoe achtergrondtaken werken in PowerShell.

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

Over achtergrondtaken

Een achtergrondtaak voert asynchroon een opdracht of expressie 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 deze 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 niet onmiddellijk de resultaten, zelfs niet als de taak zeer snel wordt uitgevoerd. Het geretourneerde taakobject bevat nuttige informatie over de taak, maar bevat geen 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 de taak te verwijderen.

Als u de timing van een achtergrondtaak onafhankelijk van andere opdrachten wilt maken, 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 op de lokale computer zijn gestart 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 worden gedeeltelijke resultaten geretourneerd. U kunt de cmdlet ook gebruiken om de Wait-Job 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. Als u een taak wilt verwijderen, gebruikt u de Remove-Job cmdlet.

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

Achtergrondtaken starten op externe computers

U kunt achtergrondtaken maken en beheren op een lokale of externe computer. Als u een achtergrondtaak extern wilt uitvoeren, gebruikt u de AsJob-parameter 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 astaakparameter van Invoke-Command, is de bovenliggende taak een leidinggevende. Er worden geen opdrachten uitgevoerd of resultaten geretourneerd. De opdrachten worden daadwerkelijk uitgevoerd door de onderliggende taken. Taken die zijn gestart met het gebruik van andere cmdlets, 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 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 voor de onderliggende taak gebruiken, 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 Start-Job een taak op een lokale computer start, bestaat de taak uit een leidinggevende bovenliggende taak en een onderliggende taak waarmee de opdracht wordt uitgevoerd.

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

  • Wanneer u Invoke-Command een opdracht uitvoert op een Start-Job 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 bovenliggende leidinggevende 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 echter ook onderliggende taken afzonderlijk beheren. Dit is het handigst 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 astaakparameter van Invoke-Command.

De volgende opdracht maakt gebruik van de AsJob-parameter voor het starten van Invoke-Command achtergrondtaken 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 weergeeft $j, ziet u dat de opdracht een taakobject met drie onderliggende taken heeft geretourneerd, één voor elke computer.

PS> $j | Format-List Name, ChildJobs

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

Wanneer u de bovenliggende taak weergeeft, ziet u 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 uitgevoerd, 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 ophalen, 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 onderliggende functie voor PowerShell-achtergrondtaken hebt u meer controle over de taken die u uitvoert.

Functietypen

PowerShell ondersteunt verschillende typen 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 PSScheduledJob-module voegt bijvoorbeeld geplande taken toe en de PSWorkflow-module voegt werkstroomtaken toe.

Aangepaste taaktypen kunnen aanzienlijk verschillen van standaard PowerShell-achtergrondtaken. Geplande taken worden bijvoorbeeld opgeslagen op schijf; 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 sommigen 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 de Get-Job cmdlet om het taaktype van een taak te vinden. Get-Job retourneert verschillende taakobjecten voor verschillende typen taken. De waarde van de eigenschap PSJobTypeName van de taakobjecten die Get-Job worden geretourneerd, geeft het taaktype aan.

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

Functietype Beschrijving
BackgroundJob De cmdlet is gestart Start-Job .
RemoteJob Gestart met de astaakparameter van de
Invoke-Command Cmdlet.
PSWorkflowJob De AsJob-parameter van een werkstroom is gestart.
PSScheduledJob Een exemplaar van een geplande taak die is gestart door een taaktrigger.
CIMJob Gestart met de AsJob-parameter van een cmdlet vanuit een
CDXML-module.
WMIJob Gestart met de AsJob-parameter van een cmdlet vanuit een
WMI-module.
PSEventJob Gemaakt met behulp vanRegister-ObjectEvent en opgeven van een
actie met de actieparameter.

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, wordt 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 krijgt de geplande taak niet, maar er worden ook exemplaren van de geplande taak gestart.

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 maken

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

Een werkstroom maken.

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 taken. De Get-Job opdracht krijgt geen geplande taken, maar krijgt exemplaren van de geplande taak die worden gestart.

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