about_Jobs

Description courte

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.

Description longue

PowerShell exécute simultanément des commandes et des scripts via des travaux. Il existe trois types de travaux fournis par PowerShell pour prendre en charge la concurrence.

  • RemoteJob - Les commandes et les scripts s’exécutent sur une session à distance. Pour plus d’informations, consultez about_Remote_Jobs.
  • BackgroundJob - Les commandes et les scripts s’exécutent dans un processus distinct sur l’ordinateur local.
  • 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. Pour plus d’informations, consultez about_Thread_Jobs.

L’exécution de scripts à distance, sur un ordinateur distinct ou dans un processus distinct, offre une grande isolation. Les erreurs qui se produisent dans le travail distant n’affectent pas d’autres travaux en cours d’exécution ou la session parente qui a démarré le travail. Toutefois, la couche de communication à distance ajoute une surcharge, y compris la sérialisation d’objets. Tous les objets sont sérialisés et désérialisés à mesure qu’ils sont passés entre la session parente et la session distante (travail). 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.

Les travaux basés sur des 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 différents threads. Si un travail a une erreur critique qui bloque le processus, tous les autres travaux du processus sont arrêtés.

Toutefois, les travaux basés sur des threads nécessitent moins de surcharge. Ils n’utilisent pas la couche de communication à distance ou la sérialisation. Les objets de résultat sont retournés en tant que références aux objets en direct dans la session active. Sans cette surcharge, les travaux basés sur des threads s’exécutent plus rapidement et utilisent moins de ressources que les autres types de travaux.

Important

La session parente qui a créé le travail surveille également l’état du travail et collecte les données de pipeline. Le processus enfant du travail est arrêté par le processus parent une fois que le travail atteint un état terminé. Si la session parente est arrêtée, tous les travaux enfants en cours d’exécution sont arrêtés avec leurs processus enfants.

Il existe deux façons de contourner cette situation :

  1. Permet Invoke-Command de créer des travaux qui s’exécutent dans des sessions déconnectées. Pour plus d’informations, consultez about_Remote_Jobs.
  2. Permet Start-Process de créer un processus plutôt qu’un travail. Pour plus d’informations, consultez Start-Process.

Applets de commande de travail

  • Start-Job - Démarre un travail en arrière-plan sur un ordinateur local.
  • Get-Job - Obtient les travaux en arrière-plan qui ont été démarrés dans la session active.
  • Receive-Job - Obtient les résultats des travaux en arrière-plan.
  • Stop-Job - Arrête une tâche en arrière-plan.
  • Wait-Job - Supprime l’invite de commandes jusqu’à ce qu’un ou tous les travaux soient terminés.
  • Remove-Job - Supprime un travail en arrière-plan.
  • Invoke-Command - Le paramètre AsJob crée un travail en arrière-plan sur un ordinateur distant. Vous pouvez utiliser Invoke-Command pour exécuter n’importe quelle commande de travail à distance, y compris Start-Job.

Guide pratique pour démarrer un travail sur l’ordinateur local

Pour démarrer un travail en arrière-plan sur l’ordinateur local, utilisez l’applet de Start-Job commande.

Pour écrire une Start-Job commande, placez la commande que le travail s’exécute en accolades ({}). Utilisez le paramètre ScriptBlock pour spécifier la commande.

La commande suivante démarre un travail en arrière-plan qui exécute une Get-Process commande sur l’ordinateur local.

Start-Job -ScriptBlock {Get-Process}

Lorsque vous démarrez un travail en arrière-plan, l’invite de commandes retourne immédiatement, même si le travail prend un temps prolongé. Vous pouvez continuer à travailler dans la session sans interruption pendant l'exécution de la tâche.

La Start-Job commande retourne un objet qui représente le travail. L’objet de travail contient des informations utiles sur le travail, mais il ne contient pas les résultats du travail.

Vous pouvez enregistrer l’objet de travail dans une variable, puis l’utiliser avec les autres applets de commande Job pour gérer le travail en arrière-plan. La commande suivante démarre un objet de travail et enregistre l’objet de travail résultant dans la $job variable.

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

À compter de PowerShell 6.0, vous pouvez utiliser l’opérateur en arrière-plan (&) à la fin d’un pipeline pour démarrer un travail en arrière-plan. Pour plus d’informations, consultez l’opérateur en arrière-plan.

L’utilisation de l’opérateur d’arrière-plan est fonctionnellement équivalente à l’utilisation de l’applet Start-Job de commande dans l’exemple précédent.

$job = Get-Process &

Obtention d’objets de travail

L’applet Get-Job de commande retourne des objets qui représentent les travaux en arrière-plan qui ont été démarrés dans la session active. Sans paramètres, Get-Job retourne tous les travaux démarrés dans la session active.

Get-Job

L’objet de travail contient l’état du travail, qui indique si le travail a terminé. Un travail terminé a un état terminé ou a échoué. Un travail peut également être bloqué ou en cours d’exécution.

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

Vous pouvez enregistrer l’objet de travail dans une variable et l’utiliser pour représenter le travail dans une commande ultérieure. La commande suivante obtient le travail avec l’ID 1 et l’enregistre dans la $job variable.

$job = Get-Job -Id 1

Obtention des résultats d’un travail

Lorsque vous exécutez un travail en arrière-plan, les résultats ne s’affichent pas immédiatement. Pour obtenir les résultats d’un travail en arrière-plan, utilisez l’applet Receive-Job de commande.

L’exemple suivant montre Receive-Job comment obtenir les résultats du travail à l’aide de l’objet de travail dans la $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. La commande suivante enregistre les résultats du travail dans la $job variable dans la $results variable.

$results = Receive-Job -Job $job

Obtention et conservation des résultats partiels du travail

L’applet Receive-Job de commande obtient les résultats d’un travail en arrière-plan. Si le travail est terminé, Receive-Job obtient tous les résultats du travail. Si le travail est toujours en cours d’exécution, Receive-Job obtient les résultats générés jusqu’à présent. Vous pouvez réexécuter Receive-Job les commandes pour obtenir les résultats restants.

Par défaut, Receive-Job supprime les résultats du cache où les résultats du travail sont stockés. Lorsque vous réexécutez Receive-Job , vous obtenez uniquement les nouveaux résultats arrivés après la première exécution.

Les commandes suivantes montrent les résultats des Receive-Job commandes exécutées avant la fin du travail.

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 du travail retournés. Les commandes suivantes montrent l’effet de l’utilisation du paramètre Keep sur un travail qui n’est pas encore terminé.

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ésultats

Si vous exécutez une commande qui prend beaucoup de temps, vous pouvez utiliser les propriétés de l’objet de travail pour déterminer quand le travail est terminé. La commande suivante utilise l’objet Get-Job pour obtenir tous les travaux en arrière-plan dans la session active.

Get-Job

Les résultats s’affichent dans une table. L’état du travail apparaît dans la colonne État .

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 révèle que le travail 2 est toujours en cours d’exécution. Si vous utilisiez l’applet Receive-Job de commande pour obtenir les résultats du travail maintenant, les résultats seraient incomplets. Vous pouvez utiliser l’applet Receive-Job de commande à plusieurs reprises pour obtenir tous les résultats. Utilisez la propriété State pour déterminer quand le travail est terminé.

Vous pouvez également utiliser le paramètre Wait de l’applet Receive-Job de commande. Lorsque 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.

Vous pouvez également utiliser l’applet Wait-Job de commande pour attendre tout ou partie des résultats du travail. Wait-Job vous permet d’attendre un ou plusieurs travaux spécifiques ou pour tous les travaux. La commande suivante utilise l’applet Wait-Job de commande pour attendre un travail avec l’ID 10.

Wait-Job -ID 10

Par conséquent, l’invite PowerShell est supprimée jusqu’à ce que le travail soit terminé.

Vous pouvez également attendre une période prédéterminée de temps. Cette commande utilise le paramètre Timeout pour limiter l’attente à 120 secondes. Lorsque l’heure expire, l’invite de commandes retourne, mais le travail continue à s’exécuter en arrière-plan.

Wait-Job -ID 10 -Timeout 120

Arrêt d’un travail

Pour arrêter un travail en arrière-plan, utilisez l’applet Stop-Job de commande. La commande suivante démarre un travail pour obtenir chaque entrée dans le journal des événements système. Il enregistre l’objet de travail dans la $job variable.

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

La commande suivante arrête le travail. Il utilise un opérateur de pipeline (|) pour envoyer le travail dans la $job variable à Stop-Job.

$job | Stop-Job

Suppression d’un travail

Pour supprimer un travail en arrière-plan, utilisez l’applet Remove-Job de commande. La commande suivante supprime le travail dans la $job variable.

Remove-Job -Job $job

Examen d’un travail ayant échoué

Les travaux peuvent échouer pour de nombreuses raisons. l’objet de travail contient une propriété Reason qui contient des informations sur la cause de l’échec.

L’exemple suivant démarre un travail sans les informations d’identification requises.

$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 rechercher l’erreur qui a provoqué l’échec du travail.

$job.ChildJobs[0].JobStateInfo.Reason

Dans ce cas, le travail a échoué, car l’ordinateur distant a requis des informations d’identification explicites pour exécuter la commande. La propriété Reason contient le message suivant :

Connecter échec de l’accès au serveur distant avec le message d’erreur suivant : « L’accès est refusé ».

Voir aussi