Partager via


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

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