À propos des emplois

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é.

VOIR AUSSI

à_propos_des_travaux_à_distance

about_Job_Details

about_Remote

about_PSSessions

Start-Job

Obtenir un emploi

Réception-Job

Arrêt du travail

Wait-Job

Suppression-Job

Invoke-Command