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 astaakparameter
Invoke-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 eenStart-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. |
Notitie
Voordat u de cmdlet Get-Job
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