Over takenAbout Jobs

Korte beschrijvingShort description

Bevat informatie over de manier waarop Power shell-achtergrond taken een opdracht of expressie op de achtergrond uitvoeren zonder interactie met de huidige sessie.Provides information about how PowerShell background jobs run a command or expression in the background without interacting with the current session.

Lange beschrijvingLong description

Met Power shell worden opdrachten en scripts gelijktijdig uitgevoerd via taken.PowerShell concurrently runs commands and scripts through jobs. Er zijn drie typen taken die door Power shell worden geboden ter ondersteuning van gelijktijdigheid.There are three jobs types provided by PowerShell to support concurrency.

  • RemoteJob -Opdrachten en scripts worden uitgevoerd op een externe sessie.RemoteJob - Commands and scripts run on a remote session. Zie about_Remote_Jobsvoor meer informatie.For information, see about_Remote_Jobs.
  • BackgroundJob -Opdrachten en scripts worden in een afzonderlijk proces op de lokale computer uitgevoerd.BackgroundJob - Commands and scripts run in a separate process on the local machine.
  • PSTaskJob of ThreadJob -opdrachten en scripts worden uitgevoerd in een afzonderlijke thread binnen hetzelfde proces op de lokale computer.PSTaskJob or ThreadJob - Commands and scripts run in a separate thread within the same process on the local machine. Zie about_Thread_Jobsvoor meer informatie.For more information, see about_Thread_Jobs.

Het uitvoeren van scripts op afstand, op een afzonderlijke machine of in een afzonderlijk proces, biedt een uitstekende isolatie.Running scripts remotely, on a separate machine or in a separate process, provides great isolation. Fouten die optreden in de externe taak hebben geen invloed op andere actieve taken of de bovenliggende sessie die de taak heeft gestart.Any errors that occur in the remote job do not affect other running jobs or the parent session that started the job. De externe laag voegt echter overhead toe, inclusief object serialisatie.However, the remoting layer adds overhead, including object serialization. Alle objecten worden geserialiseerd en gedeserialiseerd wanneer ze worden door gegeven tussen de bovenliggende sessie en de externe (taak) sessie.All objects are serialized and deserialized as they are passed between the parent session and the remote (job) session. Serialisatie van grote complexe gegevens objecten kan grote hoeveel heden reken-en geheugen bronnen verbruiken en grote hoeveel heden gegevens via het netwerk overzetten.Serialization of large complex data objects can consume large amounts of compute and memory resources and transfer large amounts of data across the network.

Thread-gebaseerde taken zijn niet zo krachtig als externe en achtergrond taken, omdat ze in hetzelfde proces op verschillende threads worden uitgevoerd.Thread-based jobs are not as robust as remote and background jobs, because they run in the same process on different threads. Als één taak een kritieke fout heeft die het proces vastloopt, worden alle andere taken in het proces beëindigd.If one job has a critical error that crashes the process, then all other jobs in the process are terminated.

Thread-gebaseerde taken vereisen echter minder overhead.However, thread-based jobs require less overhead. Ze gebruiken geen externe laag of serialisatie.They don't use the remoting layer or serialization. De resultaat objecten worden geretourneerd als verwijzingen naar live-objecten in de huidige sessie.The result objects are returned as references to live objects in the current session. Zonder deze overhead worden thread-gebaseerde taken sneller uitgevoerd en worden minder resources gebruikt dan de andere taak typen.Without this overhead, thread-based jobs run faster and use fewer resources than the other job types.

Belangrijk

Met de bovenliggende sessie die de taak heeft gemaakt, wordt ook de taak status bewaakt en worden de pijplijn gegevens verzameld.The parent session that created the job also monitors the job status and collects pipeline data. Het onderliggende proces van de taak wordt beëindigd door de bovenliggende bewerking zodra de taak de status voltooid heeft bereikt.The job child process is terminated by the parent process once the job reaches a finished state. Als de bovenliggende sessie wordt beëindigd, worden alle actieve onderliggende taken beëindigd samen met de onderliggende processen.If the parent session is terminated, all running child jobs are terminated along with their child processes.

Er zijn twee manieren om deze situatie te omzeilen:There are two ways work around this situation:

  1. Gebruiken Invoke-Command om taken te maken die worden uitgevoerd in sessies zonder verbinding.Use Invoke-Command to create jobs that run in disconnected sessions. Zie about_Remote_Jobsvoor meer informatie.For more information, see about_Remote_Jobs.
  2. Gebruiken Start-Process om een nieuw proces te maken in plaats van een taak.Use Start-Process to create a new process rather than a job. Zie start-process(Engelstalig) voor meer informatie.For more information, see Start-Process.

De taak-cmdletsThe job cmdlets

CmdletCmdlet BeschrijvingDescription
Start-Job Hiermee wordt een achtergrond taak op een lokale computer gestart.Starts a background job on a local computer.
Get-Job Hiermee worden de achtergrond taken opgehaald die zijn gestart in deGets the background jobs that were started in the
huidige sessie.current session.
Receive-Job Hiermee worden de resultaten van achtergrond taken opgehaald.Gets the results of background jobs.
Stop-Job Hiermee stopt u een achtergrond taak.Stops a background job.
Wait-Job Onderdrukt de opdracht prompt totdat een of alle taken zijnSuppresses the command prompt until one or all jobs are
aangevuld.complete.
Remove-Job Hiermee verwijdert u een achtergrond taak.Deletes a background job.
Invoke-Command Met de para meter AsJob maakt u een achtergrond taak op eenThe AsJob parameter creates a background job on a
externe computer.remote computer. U kunt gebruiken Invoke-Command om uit te voerenYou can use Invoke-Command to run
elke taak opdracht op afstand, inclusief Start-Job .any job command remotely, including Start-Job.

Een taak op de lokale computer startenHow to start a job on the local computer

Als u een achtergrond taak op de lokale computer wilt starten, gebruikt u de Start-Job cmdlet.To start a background job on the local computer, use the Start-Job cmdlet.

Als u een Start-Job opdracht wilt schrijven, moet u de opdracht sluiten die de taak in accolades () wordt uitgevoerd {} .To write a Start-Job command, enclose the command that the job runs in curly braces ({}). Gebruik de para meter script Block om de opdracht op te geven.Use the ScriptBlock parameter to specify the command.

Met de volgende opdracht wordt een achtergrond taak gestart waarmee een opdracht wordt uitgevoerd Get-Process op de lokale computer.The following command starts a background job that runs a Get-Process command on the local computer.

Start-Job -ScriptBlock {Get-Process}

Wanneer u een achtergrond taak start, wordt de opdracht prompt onmiddellijk geretourneerd, zelfs als de taak een lange tijd in beslag neemt.When you start a background job, the command prompt returns immediately, even if the job takes an extended time to complete. U kunt zonder onderbreking in de sessie blijven werken terwijl de taak wordt uitgevoerd.You can continue to work in the session without interruption while the job runs.

Start-JobMet de opdracht wordt een object geretourneerd dat de taak vertegenwoordigt.The Start-Job command returns an object that represents the job. Het taak object bevat nuttige informatie over de taak, maar bevat geen taak resultaten.The job object contains useful information about the job, but it does not contain the job results.

U kunt het taak object opslaan in een variabele en dit vervolgens gebruiken met de andere taak -cmdlets om de achtergrond taak te beheren.You can save the job object in a variable and then use it with the other Job cmdlets to manage the background job. Met de volgende opdracht wordt een taak object gestart en wordt het resulterende taak object in de $job variabele opgeslagen.The following command starts a job object and saves the resulting job object in the $job variable.

$job = Start-Job -ScriptBlock {Get-Process}

Vanaf Power shell 6,0 kunt u de operator background ( & ) aan het einde van een pijp lijn gebruiken om een achtergrond taak te starten.Beginning in PowerShell 6.0, you can use the background operator (&) at the end of a pipeline to start a background job. Zie achtergrond operatorvoor meer informatie.For more information, see background operator.

Het gebruik van de operator background is functioneel equivalent aan het gebruik Start-Job van de cmdlet in het vorige voor beeld.Using the background operator is functionally equivalent to using the Start-Job cmdlet in the previous example.

$job = Get-Process &

Taak objecten ophalenGetting job objects

De Get-Job cmdlet retourneert objecten die de achtergrond taken vertegenwoordigen die in de huidige sessie zijn gestart.The Get-Job cmdlet returns objects that represent the background jobs that were started in the current session. Zonder para meters Get-Job retourneert alle taken die in de huidige sessie zijn gestart.Without parameters, Get-Job returns all of the jobs that were started in the current session.

Get-Job

Het taak object bevat de status van de taak, die aangeeft of de taak is voltooid.The job object contains the state of the job, which indicates whether the job has finished. Een voltooide taak heeft de status voltooid of mislukt.A finished job has a state of Complete or Failed. Een taak kan ook worden geblokkeerd of uitgevoerd.A job might also be Blocked or Running.

Id  Name  PSJobTypeName State      HasMoreData  Location   Command
--  ----  ------------- -----      -----------  --------   -------
1   Job1  BackgroundJob Complete   True         localhost  Get-Process

U kunt het taak object opslaan in een variabele en gebruiken om de taak te vertegenwoordigen in een latere opdracht.You can save the job object in a variable and use it to represent the job in a later command. Met de volgende opdracht wordt de taak met ID 1 opgehaald en opgeslagen in de $job variabele.The following command gets the job with ID 1 and saves it in the $job variable.

$job = Get-Job -Id 1

De resultaten van een taak ophalenGetting the results of a job

Wanneer u een achtergrond taak uitvoert, worden de resultaten niet onmiddellijk weer gegeven.When you run a background job, the results do not appear immediately. Als u de resultaten van een achtergrond taak wilt weer geven, gebruikt u de Receive-Job cmdlet.To get the results of a background job, use the Receive-Job cmdlet.

In het volgende voor beeld worden de Receive-Job resultaten van de taak met behulp van het taak object in de variabele opgehaald met de cmdlet $job .The following example, the Receive-Job cmdlet gets the results of the job using job object in the $job variable.

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.You can save the results of a job in a variable. Met de volgende opdracht worden de resultaten van de taak in de variabele opgeslagen in $job de $results variabele.The following command saves the results of the job in the $job variable to the $results variable.

$results = Receive-Job -Job $job

Gedeeltelijke taak resultaten ophalen en bewarenGetting and keeping partial job results

De Receive-Job cmdlet haalt de resultaten van een achtergrond taak op.The Receive-Job cmdlet gets the results of a background job. Als de taak is voltooid, worden Receive-Job alle taak resultaten opgehaald.If the job is complete, Receive-Job gets all job results. Als de taak nog wordt uitgevoerd, worden Receive-Job de resultaten opgehaald die tot nu toe zijn gegenereerd.If the job is still running, Receive-Job gets the results that have been generated thus far. U kunt Receive-Job de opdrachten opnieuw uitvoeren om de resterende resultaten weer te geven.You can run Receive-Job commands again to get the remaining results.

Receive-JobDe resultaten worden standaard verwijderd uit de cache waarin de taak resultaten worden opgeslagen.By default, Receive-Job deletes the results from the cache where job results are stored. Wanneer u het Receive-Job opnieuw uitvoert, krijgt u alleen de nieuwe resultaten die na de eerste uitvoering zijn aangekomen.When you run Receive-Job again, you get only the new results that arrived after the first run.

Met de volgende opdrachten worden de resultaten weer gegeven van Receive-Job opdrachten die worden uitgevoerd voordat de taak is voltooid.The following commands show the results of Receive-Job commands run before the job is complete.

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 para meter Keep om te voor komen dat Receive-Job de geretourneerde taak resultaten worden verwijderd.Use the Keep parameter to prevent Receive-Job from deleting the job results that are returned. Met de volgende opdrachten wordt het effect van het gebruik van de para meter Keep voor een taak die nog niet is voltooid weer gegeven.The following commands show the effect of using the Keep parameter on a job that is not yet complete.

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 resultatenWaiting for the results

Als u een opdracht uitvoert die veel tijd in beslag neemt, kunt u de eigenschappen van het taak object gebruiken om te bepalen wanneer de taak is voltooid.If you run a command that takes a long time to complete, you can use the properties of the job object to determine when the job is complete. De volgende opdracht gebruikt het Get-Job object om alle achtergrond taken in de huidige sessie op te halen.The following command uses the Get-Job object to get all of the background jobs in the current session.

Get-Job

De resultaten worden weer gegeven in een tabel.The results appear in a table. De status van de taak wordt weer gegeven in de kolom status .The status of the job appears in the State column.

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 toont de status eigenschap dat taak 2 nog steeds wordt uitgevoerd.In this case, the State property reveals that Job 2 is still running. Als u de Receive-Job cmdlet nu wilt gebruiken om de resultaten van de taak te verkrijgen, zijn de resultaten niet volledig.If you were to use the Receive-Job cmdlet to get the job results now, the results would be incomplete. U kunt de Receive-Job cmdlet herhaaldelijk gebruiken om alle resultaten op te halen.You can use the Receive-Job cmdlet repeatedly to get all of the results. Gebruik de eigenschap State om te bepalen wanneer de taak is voltooid.Use the State property to determine when the job is complete.

U kunt ook de wait -para meter van de Receive-Job cmdlet gebruiken.You can also use the Wait parameter of the Receive-Job cmdlet. Wanneer u deze para meter gebruiken, wordt de opdracht prompt niet door de cmdlet geretourneerd totdat de taak is voltooid en alle resultaten beschikbaar zijn.When use use this parameter, the cmdlet does not return the command prompt until the job is completed and all results are available.

U kunt ook de Wait-Job cmdlet gebruiken om te wachten op de resultaten van de taak.You can also use the Wait-Job cmdlet to wait for any or all of the results of the job. Wait-Job Hiermee kunt u wachten op een of meer specifieke taak of voor alle taken.Wait-Job lets you wait for one or more specific job or for all jobs. De volgende opdracht gebruikt de Wait-Job cmdlet om te wachten op een taak met idThe following command uses the Wait-Job cmdlet to wait for a job with ID 10.

Wait-Job -ID 10

Als gevolg hiervan wordt de Power shell-prompt onderdrukt totdat de taak is voltooid.As a result, the PowerShell prompt is suppressed until the job is completed.

U kunt ook wachten op een vooraf bepaalde periode.You can also wait for a predetermined period of time. Met deze opdracht wordt de para meter time-out gebruikt om de wacht tijd van 120 seconden te beperken.This command uses the Timeout parameter to limit the wait to 120 seconds. Wanneer de tijd is verlopen, wordt de opdracht prompt weer gegeven, maar wordt de taak nog steeds op de achtergrond uitgevoerd.When the time expires, the command prompt returns, but the job continues to run in the background.

Wait-Job -ID 10 -Timeout 120

Een taak stoppenStopping a job

Als u een achtergrond taak wilt stoppen, gebruikt u de Stop-Job cmdlet.To stop a background job, use the Stop-Job cmdlet. Met de volgende opdracht wordt een taak gestart om elk item in het logboek voor systeem gebeurtenissen op te halen.The following command starts a job to get every entry in the System event log. Het taak object wordt opgeslagen in de $job variabele.It saves the job object in the $job variable.

$job = Start-Job -ScriptBlock {Get-EventLog -Log System}

Met de volgende opdracht wordt de taak gestopt.The following command stops the job. Er wordt een pijplijn operator ( | ) gebruikt om de taak in de $job variabele naar te verzenden Stop-Job .It uses a pipeline operator (|) to send the job in the $job variable to Stop-Job.

$job | Stop-Job

Een taak verwijderenDeleting a job

Als u een achtergrond taak wilt verwijderen, gebruikt u de Remove-Job cmdlet.To delete a background job, use the Remove-Job cmdlet. Met de volgende opdracht wordt de taak verwijderd uit de $job variabele.The following command deletes the job in the $job variable.

Remove-Job -Job $job

Een mislukte taak onderzoekenInvestigating a failed job

Taken kunnen om verschillende redenen mislukken.Jobs can fail for many reasons. het taak object bevat een eigenschap reason die informatie bevat over de oorzaak van de fout.the job object contains a Reason property that contains information about the cause of the failure.

In het volgende voor beeld wordt een taak gestart zonder de vereiste referenties.The following example starts a job without the required credentials.

$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:...

Controleer de eigenschap reason om de fout te vinden waardoor de taak is mislukt.Inspect the Reason property to find the error that caused the job to fail.

$job.ChildJobs[0].JobStateInfo.Reason

In dit geval is de taak mislukt, omdat de externe computer expliciete referenties vereist om de opdracht uit te voeren.In this case, the job failed because the remote computer required explicit credentials to run the command. De eigenschap reason bevat het volgende bericht:The Reason property contains the following message:

Verbinding maken met de externe server is mislukt met het volgende fout bericht: de toegang is geweigerd.Connecting to remote server failed with the following error message: "Access is denied".

Zie ookSee also