RUBRIQUE
about_Jobs
DESCRIPTION COURTE
Fournit des informations sur la façon dont les tâches en
arrière-plan Windows PowerShell exécutent une commande ou une
expression à l'arrière-plan sans interagir avec la session active.
DESCRIPTION LONGUE
Cette rubrique explique comment exécuter des tâches en
arrière-plan dans Windows PowerShell sur un ordinateur local.
Pour plus d'informations sur l'exécution de tâches en
arrière-plan sur des ordinateurs distants, consultez
about_Remote_Jobs.
Lorsque vous démarrez une tâche en arrière-plan, l'invite de commandes
s'affiche immédiatement, même si l'exécution de la tâche prend un
certain temps. Vous pouvez continuer à travailler dans la session
sans interruption pendant que la tâche s'exécute.
Important : les tâches en arrière-plan démarrées à l'aide de
Start-Job ou du paramètre AsJob de Invoke-Command reposent sur
l'infrastructure de communication à distance Windows PowerShell.
Pour utiliser ces fonctionnalités, Windows PowerShell doit être
configuré pour la communication à distance, même si la tâche
en arrière-plan est uniquement exécutée sur l'ordinateur local.
Pour plus d'informations, consultez about_Remote_Requirements.
COMMENT DÉMARRER UNE TÂCHE SUR L'ORDINATEUR LOCAL
Pour démarrer une tâche 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 la tâche entre accolades ({}). Utilisez le paramètre
ScriptBlock pour spécifier la commande.
La commande suivante démarre une tâche 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 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 traitement dans une variable, puis
utilisez-le avec les autres applets de commande Job pour gérer la
tâche en arrière-plan. La commande suivante démarre un objet de
traitement et enregistre l'objet de traitement résultant dans la
variable $job.
$job = start-job -scriptblock {get-process}
Vous pouvez également utiliser l'applet de commande Get-Job pour
obtenir des objets représentant les tâches démarrées dans la
session active. Get-Job retourne le même objet de traitement que
Start-Job.
OBTENTION D'OBJETS DE TRAITEMENT
Pour obtenir les objets représentant les tâches en arrière-plan
démarrées dans la session active, utilisez l'applet de commande
Get-Job. Sans paramètre, Get-Job retourne toutes les tâches
démarrées dans la session active.
Par exemple, la commande suivante obtient les tâches de la
session active.
get-job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Running True localhost get-process
Vous pouvez également enregistrer l'objet de traitement 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 traitement contient l'état de la tâche, qui indique si
celle-ci est terminée. Une tâche terminée présente un état
" Complete " (Terminée) ou " Failed " (Non réussie). Une tâche
peut également être bloquée ou en cours d'exécution.
get-job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Complete True localhost get-process
OBTENTION DES RÉSULTATS D'UNE TÂCHE
Lorsque vous exécutez une tâche 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 traitement représentant
la tâche, mais qui ne contient pas de résultat. Pour obtenir les
résultats d'une tâche 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 de la tâche. Elle utilise un objet de
traitement 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 les résultats de
la tâche de la variable $job vers la variable $results.
$results = receive-job -job $job
De même, 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 de la variable $job dans le fichier Results.txt.
receive-job -job $job > results.txt
OBTENTION ET CONSERVATION DE RÉSULTATS DE TÂCHE PARTIELS
L'applet de commande Receive-Job retourne les résultats d'une tâche en
arrière-plan. Si la tâche est terminée, Receive-Job retourne
l'ensemble des résultats. Si la tâche est toujours en cours
d'exécution, Receive-Job obtient les résultats générés jusqu'ici.
Vous pouvez réexécuter des commandes Receive-Job pour obtenir les
résultats restants.
Lorsque Receive-Job retourne des résultats, par défaut, elle
supprime les résultats du cache dans lequel les résultats des
tâches sont stockés. Si vous exécutez une autre commande
Receive-Job, vous obtenez uniquement les résultats qui n'ont pas
encore été reçus.
Les commandes suivantes indiquent les résultats de commandes
Receive-Job exécutées avant la fin de la tâche.
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 que Receive-Job ne supprime les résultats de tâche qu'il a
retournés, utilisez le paramètre Keep. Ainsi, Receive-Job retourne
tous les résultats ayant été générés jusqu'ici.
Les commandes suivantes indiquent l'effet de l'utilisation 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 DE RÉSULTATS
Si vous exécutez une commande qui prend un certain temps, vous
pouvez utiliser les propriétés de l'objet de traitement pour
déterminer à quel moment la tâche est terminée. La commande
suivante utilise l'objet Get-Job pour obtenir toutes les tâches
en arrière-plan de la session active.
get-job
Les résultats apparaissent dans une table. L'état de la tâche
apparaît dans la colonne State.
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Complete True localhost get-process
2 Job2 Running True localhost get-eventlog -log syst...
3 Job3 Complete True localhost dir -path c:\* -recurse
Dans ce cas, la propriété State révèle que la tâche 2 (Job2) est
toujours en cours d'exécution. Si vous utilisiez l'applet de
commande Receive-Job pour obtenir les résultats des tâches
maintenant, ceux-ci 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.
À ce stade, vous pouvez écrire les résultats dans un fichier,
puis ajouter les nouveaux résultats à mesure qu'ils arrivent.
Sinon, vous pouvez attendre et vérifier l'état de la tâche
ultérieurement.
Autrement, vous pouvez utiliser l'applet de commande Wait-Job
pour attendre tout ou partie des résultats de la tâche. Wait-Job
vous permet d'attendre une tâche précise, toutes les tâches ou
l'une des tâches à terminer.
La commande suivante utilise l'applet de commande Wait-Job pour
attendre une tâche avec l'ID 10.
wait-job -ID 10
Ainsi, l'invite Windows PowerShell est supprimée jusqu'à ce que
la tâche soit terminée.
Vous pouvez également attendre pendant une certaine période.
Cette commande utilise le paramètre Timeout pour limiter
l'attente à 120 secondes. Lorsque le délai expire, l'invite de
commandes s'affiche, mais la tâche continue de s'exécuter à
l'arrière-plan.
wait-job -ID 10 -timeout 120
ARRÊT D'UNE TÂCHE
Pour arrêter une tâche en arrière-plan, utilisez l'applet de
commande Stop-Job. La commande suivante démarre une tâche pour
obtenir chaque entrée du journal des événements système. Elle
enregistre l'objet de traitement 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 la tâche de la variable $job vers
Stop-Job.
$job | stop-job
SUPPRESSION D'UNE TÂCHE
Pour supprimer une tâche en 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
EXAMEN D'UNE TÂCHE NON RÉUSSIE
Pour comprendre pourquoi une tâche a échoué, utilisez la
sous-propriété Reason de l'objet de traitement.
La commande suivante démarre une tâche sans les informations
d'identification requises. Elle enregistre l'objet de traitement
dans la variable $job.
$job = start-job -scriptblock {new-item -path HKLM:\Software\MyCompany}
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Failed False localhost new-item -path HKLM:\S...
La commande suivante utilise la propriété Reason pour rechercher
l'erreur à l'origine de l'échec de la tâche.
$job.ChildJobs[0].JobStateInfo.Reason
Dans ce cas, la tâche a échoué parce que l'ordinateur distant
exigeait des informations d'identification pour exécuter la
commande. La valeur de la propriété Reason est :
La connexion au serveur distant a échoué avec le message d'erreur
suivant : Accès refusé.
APPLETS DE COMMANDE JOB
Start-Job Démarre une tâche en arrière-plan sur un
ordinateur local.
Get-Job Obtient les tâches en arrière-plan
démarrées dans la session active.
Receive-Job Obtient les résultats des tâches 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'une ou toutes les tâches soient terminées.
Remove-Job Supprime une tâche en arrière-plan.
Invoke-Command Le paramètre AsJob exécute toute commande en tant
que tâche en arrière-plan sur un ordinateur distant.
Vous pouvez également utiliser Invoke-Command pour
exécuter toute commande de tâche à distance,
y compris une commande Start-Job.
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