Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 DÉTAILLÉE
Cette rubrique explique comment exécuter des travaux en arrière-plan dans PowerShell sur un ordinateur local. Pour plus d’informations sur l’exécution de travaux d’arrière-plan sur des ordinateurs distants, reportez-vous à la about_Remote_Jobs.
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.
LES APPLETS DE COMMANDE JOB
| cmdlet | Descriptif |
|---|---|
Start-Job |
Démarre un travail 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 le |
| session en cours. | |
Receive-Job |
Obtient les résultats des travaux d’arrière-plan. |
Stop-Job |
Arrête une tâche en arrière-plan. |
Wait-Job |
Supprime l’invite de commande jusqu’à ce qu’un ou tous les travaux soient |
| complet. | |
Remove-Job |
Supprime une tâche d’arrière-plan. |
Invoke-Command |
Le paramètre AsJob exécute n’importe quelle commande en arrière-plan |
| sur un ordinateur distant. Vous pouvez également utiliser | |
Invoke-Command pour exécuter n’importe quelle commande de travail à distance, |
|
| y compris une commande Start-Job. |
COMMENT DÉMARRER UNE TÂCHE SUR L’ORDINATEUR LOCAL
Pour démarrer un travail en arrière-plan sur l’ordinateur local, utilisez l’applet de commande Start-Job.
Pour écrire une commande Start-Job, placez la commande exécutée par le travail entre 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 commande Get-Process sur l’ordinateur local.
Start-Job -ScriptBlock {Get-Process}
La commande Start-Job retourne un objet qui représente le travail. L’objet job contient des informations utiles sur le job, mais il ne contient pas les résultats du job.
Enregistrez l’objet Job dans une variable, puis utilisez-le 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 variable $job.
$job = Start-Job -ScriptBlock {Get-Process}
Vous pouvez également utiliser l’applet Get-Job de commande pour obtenir des objets qui représentent les travaux démarrés dans la session en cours.
Get-Job Renvoie le même objet de travail que Start-Job renvoie.
OBTENTION D’OBJETS DE TÂCHE
Pour obtenir un objet qui représente les travaux d’arrière-plan qui ont été démarrés dans la session en cours, utilisez l’applet de Get-Job commande. Sans paramètres, Get-Job retourne tous les travaux démarrés dans la session active.
Par exemple, la commande suivante récupère les travaux de la session en cours.
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 job dans une variable et l’utiliser pour représenter le job dans une commande ultérieure. La commande suivante récupère le travail avec l’ID 1 et l’enregistre dans la variable $job.
$job = Get-Job -Id 1
L’objet de travail contient l’état du travail, qui indique si le travail a terminé. L’état « Terminé » ou « Échec » d’une tâche terminée est « Terminé ». 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
OBTENIR LES RÉSULTATS D’UN TRAVAIL
Lorsque vous exécutez un travail en arrière-plan, les résultats ne s’affichent pas immédiatement.
Au lieu de cela, l’applet de commande Start-Job retourne un objet de travail qui représente le travail, mais qui ne contient pas les résultats. Pour obtenir les résultats d’un travail en 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 du travail. Il utilise un objet de travail enregistré dans la variable $job pour identifier le travail.
Receive-Job -Job $job
L’applet de commande Receive-Job renvoie 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 les résultats de la tâche dans la variable $job dans la variable $results.
$results = Receive-Job -Job $job
De plus, 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 du travail dans la variable $job du fichier Results.txt.
Receive-Job -Job $job > results.txt
OBTENIR ET CONSERVER DES RÉSULTATS PARTIELS DU TRAVAIL
L’applet de commande Receive-Job 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 commandes pour obtenir les résultats restants.
Lorsque Receive-Job renvoie des résultats, par défaut, il supprime ces résultats du cache où les résultats de la tâche sont stockés. Si vous exécutez une autre Receive-Job commande, vous n’obtenez que les résultats qui n’ont pas encore été reçus.
Les commandes suivantes affichent les résultats de Receive-Job commandes s’exécutent 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
Pour éviter Receive-Job de supprimer les résultats de la tâche qu’il a renvoyés, utilisez le paramètre Keep . Par conséquent, Receive-Job renvoie tous les résultats qui ont été générés jusqu’à ce moment-là.
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 ATTENDANT LES 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 d’arrière-plan de la session en cours.
Get-Job
Les résultats s’affichent dans une table. 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 ...
3 Job3 BackgroundJob Complete True localhost dir -Path C:\* -Re...
Dans ce cas, la propriété State révèle que le Job 2 est toujours en cours d’exécution. Si vous deviez utiliser l’applet de commande Receive-Job pour obtenir les résultats du travail maintenant, les résultats seraient incomplets. Vous pouvez utiliser l’applet de commande Receive-Job à plusieurs reprises pour obtenir tous les résultats. Par défaut, chaque fois que vous l’utilisez, vous obtenez uniquement les résultats qui n’ont pas encore été reçus, mais 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 résultats plus récents au fur et à mesure qu’ils arrivent, ou vous pouvez attendre et vérifier l’état du travail plus tard.
Vous pouvez utiliser le paramètre Wait de l’applet Receive-Job de commande, qui ne renvoie pas l’invite de commande tant que le travail n’est pas terminé et que tous les résultats ne sont pas disponibles.
Vous pouvez également utiliser l’applet de commande Wait-Job pour attendre tout ou partie des résultats du travail.
Wait-Job Vous permet d’attendre un travail particulier, tous les travaux ou l’un des travaux terminés.
La commande suivante utilise l’applet de commande Wait-Job 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 de commande Stop-Job. La commande suivante démarre un travail pour obtenir chaque entrée dans le journal des événements système. Il enregistre l’objet job dans la variable $job.
$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 variable $job à Stop-Job.
$job | Stop-Job
SUPPRESSION D’UNE TÂCHE
Pour supprimer un travail en arrière-plan, utilisez l’applet de commande Remove-Job. La commande suivante supprime le travail dans la variable $job.
Remove-Job -Job $job
EXAMEN D’UN TRAVAIL AYANT ÉCHOUÉ
Pour savoir pourquoi un travail a échoué, utilisez la sous-propriété Reason de l’objet de travail.
La commande suivante démarre un travail sans les informations d’identification requises. Il enregistre l’objet job 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:...
La commande suivante utilise 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 valeur de la propriété Raison est la suivante :
La connexion au serveur distant a échoué avec le message d’erreur suivant : L’accès est refusé.