À propos des travauxAbout Jobs

Description courteShort description

Fournit des informations sur la façon dont les travaux en arrière-plan PowerShell exécutent une commande ou une expression en arrière-plan sans interagir avec la session active.Provides information about how PowerShell background jobs run a command or expression in the background without interacting with the current session.

Description longueLong description

PowerShell exécute simultanément des commandes et des scripts par le biais de travaux.PowerShell concurrently runs commands and scripts through jobs. Il existe trois types de travaux fournis par PowerShell pour prendre en charge l’accès concurrentiel.There are three jobs types provided by PowerShell to support concurrency.

  • RemoteJob -Les commandes et les scripts s’exécutent sur une session à distance.RemoteJob - Commands and scripts run on a remote session. Pour plus d’informations, consultez about_Remote_Jobs.For information, see about_Remote_Jobs.
  • BackgroundJob -Les commandes et les scripts s’exécutent dans un processus distinct sur l’ordinateur local.BackgroundJob - Commands and scripts run in a separate process on the local machine.
  • PSTaskJob ou ThreadJob -les commandes et les scripts s’exécutent dans un thread distinct au sein du même processus sur l’ordinateur local.PSTaskJob or ThreadJob - Commands and scripts run in a separate thread within the same process on the local machine. Pour plus d’informations, consultez about_Thread_Jobs.For more information, see about_Thread_Jobs.

L’exécution de scripts à distance, sur un ordinateur distinct ou dans un processus distinct, offre une grande isolation.Running scripts remotely, on a separate machine or in a separate process, provides great isolation. Toutes les erreurs qui se produisent dans le travail distant n’affectent pas les autres travaux en cours d’exécution ou la session parente qui a démarré le travail.Any errors that occur in the remote job do not affect other running jobs or the parent session that started the job. Toutefois, la couche de communication à distance ajoute de la surcharge, y compris la sérialisation de l’objet.However, the remoting layer adds overhead, including object serialization. Tous les objets sont sérialisés et désérialisés lorsqu’ils sont transmis entre la session parente et la session distante (travail).All objects are serialized and deserialized as they are passed between the parent session and the remote (job) session. La sérialisation d’objets de données complexes volumineux peut consommer de grandes quantités de ressources de calcul et de mémoire et transférer de grandes quantités de données sur le réseau.Serialization of large complex data objects can consume large amounts of compute and memory resources and transfer large amounts of data across the network.

Les travaux basés sur les threads ne sont pas aussi robustes que les travaux distants et en arrière-plan, car ils s’exécutent dans le même processus sur des threads différents.Thread-based jobs are not as robust as remote and background jobs, because they run in the same process on different threads. Si un travail a une erreur critique qui bloque le processus, alors tous les autres travaux du processus sont terminés.If one job has a critical error that crashes the process, then all other jobs in the process are terminated.

Toutefois, les travaux basés sur les threads nécessitent moins de traitement.However, thread-based jobs require less overhead. Ils n’utilisent pas la couche de communication à distance ou la sérialisation.They don't use the remoting layer or serialization. Les objets de résultats sont retournés en tant que références aux objets actifs dans la session active.The result objects are returned as references to live objects in the current session. Sans cette surcharge, les travaux basés sur les threads s’exécutent plus rapidement et utilisent moins de ressources que les autres types de travaux.Without this overhead, thread-based jobs run faster and use fewer resources than the other job types.

Important

La session parente qui a créé le travail surveille également l’état du travail et collecte des données de pipeline.The parent session that created the job also monitors the job status and collects pipeline data. Le processus enfant du travail est terminé par le processus parent une fois que le travail atteint un état terminé.The job child process is terminated by the parent process once the job reaches a finished state. Si la session parente est terminée, toutes les tâches enfants en cours d’exécution sont terminées en même temps que leurs processus enfants.If the parent session is terminated, all running child jobs are terminated along with their child processes.

Il existe deux façons de contourner cette situation :There are two ways work around this situation:

  1. Utilisez Invoke-Command pour créer des travaux qui s’exécutent dans des sessions déconnectées.Use Invoke-Command to create jobs that run in disconnected sessions. Pour plus d’informations, consultez about_Remote_Jobs.For more information, see about_Remote_Jobs.
  2. Utilisez Start-Process pour créer un nouveau processus plutôt qu’un travail.Use Start-Process to create a new process rather than a job. Pour plus d’informations, consultez start-process.For more information, see Start-Process.

Applets de commande JobThe job cmdlets

Applet de commandeCmdlet DescriptionDescription
Start-Job Démarre une tâche en arrière-plan sur un ordinateur local.Starts a background job on a local computer.
Get-Job Obtient les tâches en arrière-plan qui ont été démarrées dans leGets the background jobs that were started in the
session active.current session.
Receive-Job Obtient les résultats des tâches en arrière-plan.Gets the results of background jobs.
Stop-Job Arrête une tâche en arrière-plan.Stops a background job.
Wait-Job Supprime l’invite de commandes jusqu’à ce qu’une ou toutes les tâches soientSuppresses the command prompt until one or all jobs are
Remplissez.complete.
Remove-Job Supprime une tâche en arrière-plan.Deletes a background job.
Invoke-Command Le paramètre AsJob crée une tâche en arrière-plan sur unThe AsJob parameter creates a background job on a
ordinateur distant.remote computer. Vous pouvez utiliser Invoke-Command pour exécuterYou can use Invoke-Command to run
toute commande Job à distance, y compris Start-Job .any job command remotely, including Start-Job.

Comment démarrer un travail sur l’ordinateur localHow to start a job on the local computer

Pour démarrer une tâche en arrière-plan sur l’ordinateur local, utilisez l’applet de commande Start-Job .To start a background job on the local computer, use the Start-Job cmdlet.

Pour écrire une Start-Job commande, mettez-la entre guillemets doubles ( {} ).To write a Start-Job command, enclose the command that the job runs in curly braces ({}). Utilisez le paramètre scriptblock pour spécifier la commande.Use the ScriptBlock parameter to specify the command.

La commande suivante démarre une tâche en arrière-plan qui exécute une Get-Process commande sur l’ordinateur local.The following command starts a background job that runs a Get-Process command on the local computer.

Start-Job -ScriptBlock {Get-Process}

Lorsque vous démarrez une tâche en arrière-plan, l’invite de commandes est immédiatement retournée, même si le travail prend une durée prolongée.When you start a background job, the command prompt returns immediately, even if the job takes an extended time to complete. Vous pouvez continuer à travailler dans la session sans interruption pendant l'exécution de la tâche.You can continue to work in the session without interruption while the job runs.

La Start-Job commande retourne un objet qui représente le travail.The Start-Job command returns an object that represents the job. L'objet de traitement retourné par Get-Job contient des informations utiles sur la tâche, mais ne contient pas les résultats de la tâche.The job object contains useful information about the job, but it does not contain the job results.

Vous pouvez enregistrer l’objet de traitement dans une variable, puis l’utiliser avec les autres applets de commande de tâche pour gérer la tâche en arrière-plan.You can save the job object in a variable and then use it with the other Job cmdlets to manage the background job. La commande suivante démarre un objet de traitement et enregistre l’objet de traitement résultant dans la $job variable.The following command starts a job object and saves the resulting job object in the $job variable.

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

À compter de PowerShell 6,0, vous pouvez utiliser l’opérateur d’arrière-plan ( & ) à la fin d’un pipeline pour démarrer un travail en arrière-plan.Beginning in PowerShell 6.0, you can use the background operator (&) at the end of a pipeline to start a background job. Pour plus d’informations, consultez opérateur d’arrière-plan.For more information, see background operator.

L’utilisation de l’opérateur d’arrière-plan est fonctionnellement équivalente à l’utilisation Start-Job de l’applet de commande dans l’exemple précédent.Using the background operator is functionally equivalent to using the Start-Job cmdlet in the previous example.

$job = Get-Process &

Obtention d’objets de travailGetting job objects

L' Get-Job applet de commande retourne des objets qui représentent les tâches en arrière-plan démarrées dans la session active.The Get-Job cmdlet returns objects that represent the background jobs that were started in the current session. Sans paramètres, Get-Job retourne toutes les tâches qui ont été démarrées dans la session active.Without parameters, Get-Job returns all of the jobs that were started in the current session.

Get-Job

L’objet de traitement contient l’état du travail, qui indique si le travail est terminé.The job object contains the state of the job, which indicates whether the job has finished. L’état d’une tâche terminée est terminé ou a échoué.A finished job has a state of Complete or Failed. Un travail peut également être bloqué ou en cours d’exécution.A job might also be Blocked or Running.

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

Vous pouvez enregistrer l’objet de traitement dans une variable et l’utiliser pour représenter la tâche dans une commande ultérieure.You can save the job object in a variable and use it to represent the job in a later command. La commande suivante obtient la tâche avec l’ID 1 et l’enregistre dans la $job variable.The following command gets the job with ID 1 and saves it in the $job variable.

$job = Get-Job -Id 1

Obtention des résultats d’un travailGetting the results of a job

Lorsque vous exécutez un travail en arrière-plan, les résultats n’apparaissent pas immédiatement.When you run a background job, the results do not appear immediately. Pour obtenir les résultats d’une tâche en arrière-plan, utilisez l’applet de commande Receive-Job .To get the results of a background job, use the Receive-Job cmdlet.

Dans l’exemple suivant, l' Receive-Job applet de commande obtient les résultats de la tâche à l’aide de l’objet de traitement dans la $job variable.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
...

Vous pouvez enregistrer les résultats d’un travail dans une variable.You can save the results of a job in a variable. La commande suivante enregistre les résultats de la tâche dans la variable dans la variable $job $results .The following command saves the results of the job in the $job variable to the $results variable.

$results = Receive-Job -Job $job

Obtention et conservation des résultats de travaux partielsGetting and keeping partial job results

L' Receive-Job applet de commande obtient les résultats d’une tâche en arrière-plan.The Receive-Job cmdlet gets the results of a background job. Si la tâche est terminée, Receive-Job obtient tous les résultats de la tâche.If the job is complete, Receive-Job gets all job results. Si le travail est toujours en cours d’exécution, Receive-Job obtient les résultats générés jusqu’à présent.If the job is still running, Receive-Job gets the results that have been generated thus far. Vous pouvez réexécuter Receive-Job les commandes pour obtenir les résultats restants.You can run Receive-Job commands again to get the remaining results.

Par défaut, Receive-Job supprime les résultats du cache où sont stockés les résultats de la tâche.By default, Receive-Job deletes the results from the cache where job results are stored. Lorsque vous réexécutez Receive-Job , vous recevez uniquement les nouveaux résultats qui arrivent après la première exécution.When you run Receive-Job again, you get only the new results that arrived after the first run.

Les commandes suivantes affichent les résultats des Receive-Job commandes exécutées avant la fin du travail.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

Utilisez le paramètre Keep pour empêcher Receive-Job la suppression des résultats de la tâche retournés.Use the Keep parameter to prevent Receive-Job from deleting the job results that are returned. Les commandes suivantes montrent l’effet de l’utilisation du paramètre Keep sur un travail qui n’est pas encore terminé.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

En attente des résultatsWaiting for the results

Si vous exécutez une commande qui prend beaucoup de temps, vous pouvez utiliser les propriétés de l’objet de traitement pour déterminer à quel moment le travail est terminé.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. La commande suivante utilise l' Get-Job objet pour récupérer toutes les tâches en arrière-plan dans la session active.The following command uses the Get-Job object to get all of the background jobs in the current session.

Get-Job

Les résultats s’affichent dans un tableau.The results appear in a table. L’état de la tâche s’affiche dans la colonne État .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...

Dans ce cas, la propriété State indique que le travail 2 est toujours en cours d’exécution.In this case, the State property reveals that Job 2 is still running. Si vous deviez utiliser l' Receive-Job applet de commande pour obtenir les résultats du travail maintenant, les résultats seraient incomplets.If you were to use the Receive-Job cmdlet to get the job results now, the results would be incomplete. Vous pouvez utiliser l' Receive-Job applet de commande à plusieurs reprises pour obtenir tous les résultats.You can use the Receive-Job cmdlet repeatedly to get all of the results. Utilisez la propriété State pour déterminer à quel moment le travail est terminé.Use the State property to determine when the job is complete.

Vous pouvez également utiliser le paramètre Wait de l' Receive-Job applet de commande.You can also use the Wait parameter of the Receive-Job cmdlet. Quand vous utilisez ce paramètre, l’applet de commande ne retourne pas l’invite de commandes tant que le travail n’est pas terminé et que tous les résultats sont disponibles.When use use this parameter, the cmdlet does not return the command prompt until the job is completed and all results are available.

Vous pouvez également utiliser l' Wait-Job applet de commande pour attendre un ou plusieurs des résultats de la tâche.You can also use the Wait-Job cmdlet to wait for any or all of the results of the job. Wait-Job permet d’attendre une ou plusieurs tâches spécifiques ou pour tous les travaux.Wait-Job lets you wait for one or more specific job or for all jobs. La commande suivante utilise l' Wait-Job applet de commande pour attendre un travail avec l' IDThe following command uses the Wait-Job cmdlet to wait for a job with ID 10.

Wait-Job -ID 10

Par conséquent, l’invite PowerShell est supprimée jusqu’à ce que la tâche soit terminée.As a result, the PowerShell prompt is suppressed until the job is completed.

Vous pouvez également attendre une période prédéterminée.You can also wait for a predetermined period of time. Cette commande utilise le paramètre timeout pour limiter l’attente à 120 secondes.This command uses the Timeout parameter to limit the wait to 120 seconds. Lorsque le délai expire, l’invite de commandes retourne, mais le travail continue à s’exécuter en arrière-plan.When the time expires, the command prompt returns, but the job continues to run in the background.

Wait-Job -ID 10 -Timeout 120

Arrêt d’un travailStopping a job

Pour arrêter une tâche en arrière-plan, utilisez l’applet de commande Stop-Job .To stop a background job, use the Stop-Job cmdlet. La commande suivante démarre un travail pour obtenir chaque entrée dans le journal des événements système.The following command starts a job to get every entry in the System event log. Elle enregistre l’objet de traitement dans la $job variable.It saves the job object in the $job variable.

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

La commande suivante arrête le travail.The following command stops the job. Elle utilise un opérateur de pipeline ( | ) pour envoyer la tâche dans la $job variable à Stop-Job .It uses a pipeline operator (|) to send the job in the $job variable to Stop-Job.

$job | Stop-Job

Suppression d’un travailDeleting a job

Pour supprimer une tâche en arrière-plan, utilisez l’applet de commande Remove-Job .To delete a background job, use the Remove-Job cmdlet. La commande suivante supprime la tâche dans la $job variable.The following command deletes the job in the $job variable.

Remove-Job -Job $job

Examen d’un travail ayant échouéInvestigating a failed job

Les travaux peuvent échouer pour de nombreuses raisons.Jobs can fail for many reasons. l’objet de traitement contient une propriété reason qui contient des informations sur la cause de l’échec.the job object contains a Reason property that contains information about the cause of the failure.

L’exemple suivant démarre un travail sans les informations d’identification requises.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:...

Inspectez la propriété reason pour trouver l’erreur qui a provoqué l’échec du travail.Inspect the Reason property to find the error that caused the job to fail.

$job.ChildJobs[0].JobStateInfo.Reason

Dans ce cas, la tâche a échoué, car l’ordinateur distant nécessitait des informations d’identification explicites pour exécuter la commande.In this case, the job failed because the remote computer required explicit credentials to run the command. La propriété reason contient le message suivant :The Reason property contains the following message:

La connexion au serveur distant a échoué avec le message d’erreur suivant : « accès refusé ».Connecting to remote server failed with the following error message: "Access is denied".

Voir aussiSee also