about_Jobs
Korte beschrijving
Bevat informatie over hoe PowerShell-achtergrondtaken een opdracht of expressie op de achtergrond uitvoeren zonder interactie met de huidige sessie.
Lange beschrijving
PowerShell voert gelijktijdig opdrachten en scripts uit via taken. PowerShell biedt drie soorten taken ter ondersteuning van gelijktijdigheid.
RemoteJob
- Opdrachten en scripts worden uitgevoerd op een externe sessie. Zie voor meer informatie about_Remote_Jobs.BackgroundJob
- Opdrachten en scripts worden in een afzonderlijk proces op de lokale computer uitgevoerd.PSTaskJob
ofThreadJob
: opdrachten en scripts worden uitgevoerd in een afzonderlijke thread binnen hetzelfde proces op de lokale computer. Zie voor meer informatie about_Thread_Jobs.
Scripts op afstand, op een afzonderlijke computer of in een afzonderlijk proces uitvoeren, biedt een goede isolatie. Fouten die optreden in de externe taak hebben geen invloed op andere taken die worden uitgevoerd of op de bovenliggende sessie die de taak heeft gestart. De remoting-laag voegt echter overhead toe, met inbegrip van objectser serialisatie. Alle objecten worden geserialiseerd en gedeserialiseerd wanneer ze worden doorgegeven tussen de bovenliggende sessie en de externe (taak)sessie. Serialisatie van grote complexe gegevensobjecten kan grote hoeveelheden reken- en geheugenbronnen verbruiken en grote hoeveelheden gegevens over het netwerk overdragen.
Threadtaken zijn niet zo robuust als externe en achtergrondtaken, omdat ze in hetzelfde proces worden uitgevoerd op verschillende threads. Als één taak een kritieke fout heeft die het proces vast loopt, worden alle andere taken in het proces beëindigd.
Op thread gebaseerde taken vereisen echter minder overhead. Ze maken geen gebruik van de remoting-laag of serialisatie. De resultaatobjecten worden geretourneerd als verwijzingen naar live-objecten in de huidige sessie. Zonder deze overhead worden threadtaken sneller uitgevoerd en gebruiken ze minder resources dan de andere taaktypen.
Belangrijk
De bovenliggende sessie die de taak heeft gemaakt, controleert ook de taakstatus en verzamelt pijplijngegevens. Het onderliggende proces van de taak wordt beëindigd door het bovenliggende proces zodra de taak de status Voltooid heeft. Als de bovenliggende sessie wordt beëindigd, worden alle onderliggende taken die worden uitgevoerd, samen met hun onderliggende processen beëindigd.
Er zijn twee manieren om deze situatie te voorkomen:
- Gebruik
Invoke-Command
om taken te maken die worden uitgevoerd in niet-verbonden sessies. Zie voor meer informatie about_Remote_Jobs. - Gebruik
Start-Process
om een nieuw proces te maken in plaats van een taak. Zie Start-Process voor meer informatie.
De taak-cmdlets
Cmdlet | Beschrijving |
---|---|
Start-Job |
Start een achtergrond taak op een lokale computer. |
Get-Job |
Haalt de achtergrondtaken op die zijn gestart in de |
huidige sessie. | |
Receive-Job |
Haalt de resultaten van achtergrondtaken op. |
Stop-Job |
Een achtergrond taak stopt. |
Wait-Job |
Onderdrukt de opdrachtprompt totdat een of alle taken zijn |
Volledige. | |
Remove-Job |
Hiermee verwijdert u een achtergrond taak. |
Invoke-Command |
Met de parameter AsJob wordt een achtergrondjob gemaakt op een |
externe computer. U kunt gebruiken om uit Invoke-Command te voeren |
|
een taakopdracht op afstand, met inbegrip van Start-Job . |
Een taak starten op de lokale computer
Als u een achtergrond taak op de lokale computer wilt starten, gebruikt u de Start-Job
cmdlet .
Als u een opdracht Start-Job
wilt schrijven, sluit u de opdracht die de taak wordt uitgevoerd, tussen accolades ({}
). Gebruik de parameter ScriptBlock om de opdracht op te geven.
Met de volgende opdracht start u een achtergrond taak die een opdracht Get-Process
op de lokale computer wordt uitgevoerd.
Start-Job -ScriptBlock {Get-Process}
Wanneer u een achtergrondopdracht start, wordt de opdrachtprompt onmiddellijk terug gegeven, zelfs als het langer duurt om de taak te voltooien. U kunt zonder onderbreking in de sessie blijven werken terwijl de taak wordt uitgevoerd.
De Start-Job
opdracht retourneert een -object dat de taak vertegenwoordigt. Het taakobject bevat nuttige informatie over de taak, maar bevat niet de taakresultaten.
U kunt het taakobject opslaan in een variabele en het vervolgens gebruiken met de andere taak-cmdlets om de achtergrond job te beheren. Met de volgende opdracht start u een taakobject en slaat u het resulterende taakobject op in de $job
variabele .
$job = Start-Job -ScriptBlock {Get-Process}
Vanaf PowerShell 6.0 kunt u de achtergrondoperator (&
) aan het einde van een pijplijn gebruiken om een achtergrond job te starten. Zie achtergrondoperator voor meer informatie.
Het gebruik van de achtergrondoperator is functioneel gelijk aan het gebruik van de Start-Job
cmdlet in het vorige voorbeeld.
$job = Get-Process &
Taakobjecten verkrijgen
De Get-Job
cmdlet retourneert objecten die de achtergrondtaken vertegenwoordigen die in de huidige sessie zijn gestart. Zonder parameters, Get-Job
retourneert alle taken die zijn gestart in de huidige sessie.
Get-Job
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 wordt uitgevoerd.
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
U kunt het taakobject opslaan in een variabele en dit gebruiken om de taak in een latere opdracht weer te geven. Met de volgende opdracht haalt u de taak op met id 1 en slaat u deze op in de $job
variabele .
$job = Get-Job -Id 1
De resultaten van een taak verkrijgen
Wanneer u een achtergrond job uitvoeren, worden de resultaten niet onmiddellijk weergegeven. Gebruik de cmdlet om de resultaten van een achtergrond job Receive-Job
op te halen.
In het volgende voorbeeld haalt de Receive-Job
cmdlet de resultaten van de taak op met behulp van het taakobject in de $job
variabele .
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
668 7 2672 6168 104 32.26 488 csrss
...
U kunt de resultaten van een taak opslaan in een variabele. De volgende opdracht slaat de resultaten van de taak in de variabele $job
op in de $results
variabele .
$results = Receive-Job -Job $job
Gedeeltelijke taakresultaten verkrijgen en bewaren
De Receive-Job
cmdlet haalt de resultaten van een achtergrond job op. Als de taak is voltooid, haalt Receive-Job
alle taakresultaten op. Als de taak nog steeds wordt uitgevoerd, haalt Receive-Job
de resultaten op die tot nu toe zijn gegenereerd. U kunt opdrachten opnieuw Receive-Job
uitvoeren om de resterende resultaten op te halen.
Hiermee verwijdert u Receive-Job
standaard de resultaten uit de cache waar de taakresultaten worden opgeslagen. Wanneer u opnieuw Receive-Job
wordt uitgevoerd, krijgt u alleen de nieuwe resultaten die zijn binnengekomen na de eerste run.
De volgende opdrachten tonen de resultaten van opdrachten Receive-Job
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
Gebruik de parameter Keep om te voorkomen Receive-Job
dat de geretourneerde taakresultaten worden verwijderd. 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 hebt uitgevoerd die lang duurt, kunt u de eigenschappen van het taakobject gebruiken om te bepalen wanneer de taak is voltooid. De volgende opdracht maakt gebruik van Get-Job
het -object 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 blijkt uit de eigenschap State dat taak 2 nog steeds wordt uitgevoerd. Als u de cmdlet zou Receive-Job
gebruiken om nu de taakresultaten op te halen, zouden de resultaten onvolledig zijn. U kunt de Receive-Job
cmdlet herhaaldelijk gebruiken om alle resultaten op te halen. Gebruik de eigenschap Status om te bepalen wanneer de taak is voltooid.
U kunt ook de parameter Wait van de Receive-Job
cmdlet gebruiken. Wanneer u deze parameter gebruikt, retourneerd de cmdlet de opdrachtprompt pas als 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
met kunt u wachten op een of meer specifieke taken of op alle taken.
De volgende opdracht gebruikt de Wait-Job
cmdlet 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-out parameter om de wachttijd te beperken tot 120 seconden. Wanneer de tijd is verstreken, wordt de opdrachtprompt terug gegeven, maar blijft de taak op de achtergrond worden uitgevoerd.
Wait-Job -ID 10 -Timeout 120
Een taak stoppen
Als u een achtergrond taak wilt stoppen, gebruikt u de Stop-Job
cmdlet . Met de volgende opdracht wordt een taak gestart om elke vermelding in het gebeurtenislogboek van het systeem op te halen. Hiermee slaat u het taakobject op in de $job
variabele .
$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 naar $job
te verzenden Stop-Job
.
$job | Stop-Job
Een taak verwijderen
Als u een achtergrond taak wilt verwijderen, gebruikt u de Remove-Job
cmdlet . Met de volgende opdracht wordt de taak in de variabele $job
verwijderd.
Remove-Job -Job $job
Een mislukte taak onderzoeken
Taken kunnen om verschillende redenen mislukken. het taakobject bevat de eigenschap Reason die informatie bevat over de oorzaak van de fout.
In het volgende voorbeeld wordt een taak gestart zonder de vereiste referenties.
$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Get-Job $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Failed False localhost New-Item -Path HKLM:...
Inspecteer 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 heeft om de opdracht uit te voeren. De eigenschap Reason bevat het volgende bericht:
Verbinding maken met de externe server is mislukt met het volgende foutbericht: 'Toegang wordt geweigerd'.
Zie ook
Feedback
Feedback verzenden en weergeven voor