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 eenStart-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 $j
weergeeft, 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