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 l’accès concurrentiel.
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
ouThreadJob
: 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 isolation parfaite. 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. Toutefois, la couche de communication à distance ajoute une surcharge, y compris la sérialisation des 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 des threads différents. Si un travail présente 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 à des objets actifs 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 le travail status 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 terminé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 :
- Utilisez
Invoke-Command
pour créer des travaux qui s’exécutent dans des sessions déconnectées. Pour plus d’informations, consultez about_Remote_Jobs. - Utilisez
Start-Process
pour 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 un travail en arrière-plan.Wait-Job
- Supprime l’invite de commandes jusqu’à ce qu’une ou toutes les tâches soient terminées.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 utiliserInvoke-Command
pour exécuter n’importe quelle commande de travail à distance, y comprisStart-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 exécute dans des 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 la tâche prend un certain temps. 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 d’arrière-plan (&
) à la fin d’un pipeline pour démarrer un travail en arrière-plan. Pour plus d’informations, consultez Opérateur d’arrière-plan.
L’utilisation de l’opérateur d’arrière-plan équivaut fonctionnellement à 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 qui ont été démarrés dans la session active.
Get-Job
L’objet de travail contient l’état du travail, qui indique si le travail est terminé. Un travail terminé a l’état Terminé ou Échec. 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 n’apparaissent pas immédiatement. Pour obtenir les résultats d’un travail en arrière-plan, utilisez l’applet de Receive-Job
commande .
Dans l’exemple suivant, l’applet Receive-Job
de commande obtient 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 $results
.
$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 qui ont été 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ù sont stockés les résultats du travail. Lorsque vous exécutez Receive-Job
à nouveau, vous obtenez uniquement les nouveaux résultats qui sont 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
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 de la session active.
Get-Job
Les résultats s’affichent dans un tableau. Le status du travail s’affiche 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 indique que le travail 2 est toujours en cours d’exécution. Si vous deviez utiliser 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 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. Cette commande utilise le paramètre Timeout pour limiter l’attente à 120 secondes. Lorsque le délai 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 de Stop-Job
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 de Remove-Job
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 la défaillance.
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 exigeait des informations d’identification explicites pour exécuter la commande. La propriété Reason contient le message suivant :
Échec de la connexion au serveur distant avec le message d’erreur suivant : « L’accès est refusé ».