À propos des travaux
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 en arrière-plan sur des ordinateurs distants, consultez about_Remote_Jobs.
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 temps prolongé. Vous pouvez continuer à travailler dans la session sans interruption pendant l'exécution de la tâche.
APPLETS DE COMMANDE DE TRAVAIL
Applet de commande | Description |
---|---|
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 le |
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’un ou tous les travaux soient |
Complet. | |
Remove-Job |
Supprime un travail en arrière-plan. |
Invoke-Command |
Le paramètre AsJob exécute n’importe quelle commande en arrière-plan |
travail sur un ordinateur distant. Vous pouvez également utiliser | |
Invoke-Command pour exécuter une commande de travail à distance, |
|
y compris une commande 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 commande Start-Job.
Pour écrire une commande Start-Job, 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}
La Start-Job
commande retourne un objet qui représente le travail. 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.
Enregistrez l’objet de travail 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 de Get-Job
commande pour obtenir des objets qui représentent les travaux démarrés dans la session active. Get-Job
retourne le même objet de travail que Start-Job retourne.
OBTENTION D’OBJETS DE TRAVAIL
Pour obtenir un objet qui représente les travaux en arrière-plan démarrés dans la session active, utilisez l’applet de Get-Job
commande. Sans paramètres, Get-Job
retourne tous les travaux qui ont été démarrés dans la session active.
Par exemple, la commande suivante obtient les travaux 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 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 variable $job.
$job = Get-Job -Id 1
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.
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
Lorsque vous exécutez un travail en arrière-plan, les résultats n’apparaissent pas immédiatement.
Au lieu de cela, l’applet de commande Start-Job retourne un objet de travail qui représente le travail, mais il ne contient pas les résultats. Pour obtenir les résultats d’un travail en arrière-plan, utilisez l’applet de Receive-Job
commande .
La commande suivante utilise l’applet Receive-Job
de commande 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 retourne les résultats du travail.
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’un travail dans une variable. La commande suivante enregistre les résultats du travail dans la variable $job dans la variable $results.
$results = Receive-Job -Job $job
Vous pouvez également enregistrer les résultats du travail 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 dans le fichier Results.txt.
Receive-Job -Job $job > results.txt
OBTENTION ET CONSERVATION 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 qui ont été générés jusqu’à présent.
Vous pouvez réexécuter Receive-Job
des commandes pour obtenir les résultats restants.
Lorsque Receive-Job
retourne des résultats, par défaut, il supprime ces résultats du cache où sont stockés les résultats du travail. Si vous exécutez une autre Receive-Job
commande, vous obtenez uniquement les résultats qui ne sont pas encore reçus.
Les commandes suivantes affichent 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
Pour éviter Receive-Job
de supprimer les résultats du travail qu’il a retournés, utilisez le paramètre Keep . Par conséquent, Receive-Job
retourne tous les résultats qui ont été générés jusqu’à cette date.
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 à quel moment 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 une table. 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 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. 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 des résultats plus récents à mesure qu’ils arrivent ou vous pouvez attendre et case activée l’état du travail ultérieurement.
Vous pouvez utiliser le paramètre Wait de l’applet Receive-Job
de commande, qui ne retourne pas l’invite de commandes tant que le travail n’est pas terminé et que tous les résultats ne sont pas 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 qu’un travail particulier, tous les travaux ou l’un des travaux soit terminé.
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. 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 de 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 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’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 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 de travail 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 exigeait des informations d’identification explicites pour exécuter la commande. La valeur de la propriété Reason est :
Échec de la connexion au serveur distant avec le message d’erreur suivant : Accès refusé.