about_Jobs
Mis à jour: mai 2014
S'applique à: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0
RUBRIQUE
about_Jobs
DESCRIPTION COURTE
Fournit des informations sur la façon dont les tâches d'arrière-plan Windows PowerShell exécutent une commande ou une expression en arrière-plan sans interagir avec la session active.
DESCRIPTION DÉTAILLÉE
Cette rubrique explique comment exécuter des tâches d'arrière-plan dans Windows PowerShell sur un ordinateur local. Pour plus d'informations sur l'exécution des tâches d'arrière-plan sur des ordinateurs distants, consultez about_Remote_Jobs.
Quand vous démarrez une tâche d'arrière-plan, l'invite de commandes est immédiatement retournée, même si la tâche se termine plus tard. Vous pouvez continuer à travailler dans la session sans interruption pendant l'exécution de la tâche.
APPLETS DE COMMANDE JOB
Start-Job
Démarre une tâche d'arrière-plan sur un ordinateur local.
Get-Job
Obtient les tâches d'arrière-plan qui ont été démarrées dans la session active.
Receive-Job
Obtient les résultats des tâches d'arrière-plan.
Stop-Job
Arrête une tâche d'arrière-plan.
Wait-Job
Suspend l'invite de commandes jusqu'à ce qu'une tâche ou l'ensemble des tâches soient terminées.
Remove-Job
Supprime une tâche d'arrière-plan.
Invoke-Command
Le paramètre AsJob exécute toutes les commandes en tant que tâches d'arrière-plan sur un ordinateur distant. Vous pouvez également utiliser Invoke-Command pour exécuter les commandes de tâche à distance, y compris une commande Start-Job.
DÉMARRAGE D'UNE TÂCHE SUR L'ORDINATEUR LOCAL
Pour démarrer une tâche d'arrière-plan sur l'ordinateur local, utilisez l'applet de commande Start-Job.
Pour écrire une commande Start-Job, placez la commande qui est exécutée par la tâche entre accolades ( { } ). Utilisez le paramètre ScriptBlock pour spécifier la commande.
La commande suivante démarre une tâche d'arrière-plan qui exécute une commande Get-Process sur l'ordinateur local.
Start-Job -ScriptBlock {Get-Process}
La commande Start-Job retourne un objet qui représente la tâche. L'objet de traitement contient des informations utiles sur la tâche, mais ne contient pas les résultats de la tâche.
Enregistrez l'objet de tâche dans une variable, puis utilisez-le avec les autres applets de commande Job pour gérer la tâche d'arrière-plan. La commande suivante démarre un objet de tâche et enregistre l'objet obtenu dans la variable $job.
$job = Start-Job -ScriptBlock {Get-Process}
Vous pouvez également utiliser l'applet de commande Get-Job pour obtenir les objets qui représentent les tâches démarrées au cours de la session active. Get-Job retourne le même objet de tâche que Start-Job.
OBTENTION D'OBJETS DE TÂCHE
Pour obtenir les objets qui représentent les tâches d'arrière-plan qui ont été démarrées au cours de la session active, utilisez l'applet de commande Get-Job. Sans paramètres, Get-Job retourne toutes les tâches qui ont été démarrées au cours de la session active.
Par exemple, la commande suivante obtient les tâches de la session active.
PS C:\>Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost Get-Process
Vous pouvez également enregistrer l'objet de tâche dans une variable et l'utiliser pour représenter la tâche dans une commande ultérieure. La commande suivante obtient la tâche avec l'ID 1 et l'enregistre dans la variable $job.
$job = Get-Job -Id 1
L'objet de tâche contient l'état de la tâche, qui indique si celle-ci est terminée. L'état d'une tâche terminée peut être « Terminé » ou « Échec ». Une tâche peut également être bloquée ou en cours d'exécution.
Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
OBTENTION DES RÉSULTATS D'UNE TÂCHE
Quand vous exécutez une tâche d'arrière-plan, les résultats n'apparaissent pas immédiatement. Au lieu de cela, l'applet de commande Start-Job retourne un objet qui représente la tâche, mais ne contient pas les résultats. Pour obtenir les résultats d'une tâche d'arrière-plan, utilisez l'applet de commande Receive-Job.
La commande suivante utilise l'applet de commande Receive-Job pour obtenir les résultats de la tâche. Elle utilise un objet de tâche enregistré dans la variable $job pour identifier la tâche.
Receive-Job -Job $job
L'applet de commande Receive-Job retourne les résultats de la tâche.
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 également enregistrer les résultats d'une tâche dans une variable. La commande suivante enregistre dans la variable $results les résultats de la tâche enregistrée dans la variable $job.
$results = Receive-Job -Job $job
Vous pouvez enregistrer les résultats de la tâche dans un fichier à l'aide de l'opérateur de redirection (>) ou de l'applet de commande Out-File. La commande suivante utilise l'opérateur de redirection pour enregistrer les résultats de la tâche dans la variable $job, dans le fichier Results.txt.
Receive-Job -Job $job > results.txt
OBTENTION ET CONSERVATION PARTIELLE DE RÉSULTATS DE TÂCHE
L'applet de commande Receive-Job obtient les résultats d'une tâche d'arrière-plan. Si la tâche est terminée, Receive-Job obtient tous les résultats de la tâche. Si la tâche est 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 des commandes Receive-Job pour obtenir les résultats restants.
Quand Receive-Job retourne des résultats, par défaut, il les supprime du cache où sont stockés les résultats de tâche. Si vous exécutez une autre commande Receive-Job, vous obtiendrez uniquement les résultats non encore reçus.
Les commandes suivantes montrent que les résultats des commandes Receive-Job qui sont exécutées avant que la tâche ne soit terminée.
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
Pour empêcher Receive-Job de supprimer les résultats de tâche qu'il a retournés, utilisez le paramètre Keep. Receive-Job retournera alors tous les résultats qui ont été générés jusqu'à présent.
Les commandes suivantes montrent l'effet du paramètre Keep sur une tâche qui n'est pas encore terminée.
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 met du temps à se terminer, vous pouvez utiliser les propriétés de l'objet de tâche pour déterminer la fin de la tâche. La commande suivante utilise l'objet Get-Job pour obtenir toutes les tâches d'arrière-plan de la session active.
Get-Job
Les résultats s'affichent dans un tableau. L'état de la tâche 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 Syst...
3 Job3 BackgroundJob Complete True localhost dir -Path C:\* -Recurse
Dans ce cas, la propriété State révèle que Job 2 est toujours en cours d'exécution. Si vous deviez utiliser l'applet de commande Receive-Job pour obtenir les résultats de la tâche à ce moment-là, ceux-ci seraient incomplets. Vous pouvez utiliser l'applet de commande Receive-Job à plusieurs reprises pour obtenir les résultats. Par défaut, chaque fois que vous l'utilisez, vous obtenez uniquement les résultats non encore reçus. Toutefois, vous pouvez utiliser le paramètre Keep de l'applet de commande Receive-Job pour conserver les résultats, même s'ils ont déjà été reçus.
Vous pouvez écrire les résultats partiels dans un fichier, puis ajouter les nouveaux résultats à mesure qu'ils arrivent. Vous pouvez également attendre et vérifier l'état de la tâche ultérieurement.
Vous pouvez utiliser le paramètre Wait de l'applet de commande Receive-Job. De cette façon, l'invite de commandes ne sera pas retournée tant que la tâche ne sera pas terminée et que tous les résultats ne seront pas disponibles.
L'applet de commande Wait-Job permet également d'attendre l'ensemble ou une partie des résultats de la tâche. Wait-Job vous permet d'attendre une tâche en particulier, d'attendre toutes les tâches ou d'attendre l'une des tâches devant se terminer.
La commande suivante utilise l'applet de commande Wait-Job pour attendre une tâche avec l'ID 10.
Wait-Job -ID 10
L'invite de commandes Windows PowerShell est ainsi suspendue jusqu'à la fin de la tâche.
Vous pouvez également attendre pendant une durée prédéterminée. Cette commande utilise le paramètre Timeout pour limiter l'attente à 120 secondes. Quand le délai expire, l'invite de commandes est retournée, mais la tâche continue de s'exécuter en arrière-plan.
Wait-Job -ID 10 -Timeout 120
ARRÊT D'UNE TÂCHE
Pour arrêter une tâche d'arrière-plan, utilisez l'applet de commande Stop-Job. La commande suivante démarre une tâche pour obtenir toutes les entrées du journal des événements système. L'objet de tâche est enregistré dans la variable $job.
$job = Start-Job -ScriptBlock {Get-EventLog -Log System}
La commande suivante arrête la tâche. Elle utilise un opérateur de pipeline (|) pour envoyer à Stop-Job la tâche située dans la variable $job.
$job | Stop-Job
SUPPRESSION D'UNE TÂCHE
Pour supprimer une tâche d'arrière-plan, utilisez l'applet de commande Remove-Job. La commande suivante supprime la tâche de la variable $job.
Remove-Job -Job $job
ANALYSE D'UN ÉCHEC DE TÂCHE
Pour savoir pourquoi une tâche a échoué, utilisez la sous-propriété Reason de l'objet de tâche.
La commande suivante démarre une tâche sans les informations d'identification requises. L'objet de tâche est enregistré dans la variable $job.
$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Failed False localhost New-Item -Path HKLM:\S...
La commande suivante utilise la propriété Reason pour rechercher l'erreur qui a provoqué l'échec de la tâche.
$job.ChildJobs[0].JobStateInfo.Reason
Dans ce cas, la tâche a échoué parce que l'ordinateur distant nécessitait des informations d'identification explicites pour exécuter la commande. La valeur de la propriété Reason est la suivante :
Connecting to remote server failed with the following error
message : Access is denied.
VOIR AUSSI
about_Remote_Jobs
about_Job_Details
about_Remote
about_PSSessions
Start-Job
Get-Job
Receive-Job
Stop-Job
Wait-Job
Remove-Job
Invoke-Command