about_Jobs

Mis à jour: mai 2014

S'applique à: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

RUBRIQUE

about_Jobs

DESCRIPTION COURTE

Fournit des informations sur la façon dont les tâches d'arrière-plan Windows 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 tâches d'arrière-plan dans Windows PowerShell sur un ordinateur local. Pour plus d'informations sur l'exécution des tâches d'arrière-plan sur des ordinateurs distants, consultez about_Remote_Jobs.

Quand vous démarrez une tâche d'arrière-plan, l'invite de commandes est immédiatement retournée, même si la tâche se termine plus tard. Vous pouvez continuer à travailler dans la session sans interruption pendant l'exécution de la tâche.

APPLETS DE COMMANDE JOB

Start-Job

Démarre une tâche 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 la session active.

Receive-Job

Obtient les résultats des tâches d'arrière-plan.

Stop-Job

Arrête une tâche d'arrière-plan.

Wait-Job

Suspend l'invite de commandes jusqu'à ce qu'une tâche ou l'ensemble des tâches soient terminées.

Remove-Job

Supprime une tâche d'arrière-plan.

Invoke-Command

Le paramètre AsJob exécute toutes les commandes en tant que tâches d'arrière-plan sur un ordinateur distant. Vous pouvez également utiliser Invoke-Command pour exécuter les commandes de tâche à distance, y compris une commande Start-Job.

DÉMARRAGE D'UNE TÂCHE SUR L'ORDINATEUR LOCAL

Pour démarrer une tâche d'arrière-plan sur l'ordinateur local, utilisez l'applet de commande Start-Job.

Pour écrire une commande Start-Job, placez la commande qui est 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 d'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 tâche dans une variable, puis utilisez-le avec les autres applets de commande Job pour gérer la tâche d'arrière-plan. La commande suivante démarre un objet de tâche et enregistre l'objet obtenu dans la variable $job.

        $job = Start-Job -ScriptBlock {Get-Process}

Vous pouvez également utiliser l'applet de commande Get-Job pour obtenir les objets qui représentent les tâches démarrées au cours de la session active. Get-Job retourne le même objet de tâche que Start-Job.

OBTENTION D'OBJETS DE TÂCHE

Pour obtenir les objets qui représentent les tâches d'arrière-plan qui ont été démarrées au cours de la session active, utilisez l'applet de commande Get-Job. Sans paramètres, Get-Job retourne toutes les tâches qui ont été démarrées au cours de la session active.

Par exemple, la commande suivante obtient les tâches 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 tâche 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 tâche contient l'état de la tâche, qui indique si celle-ci est terminée. L'état d'une tâche terminée peut être « Terminé » ou « Échec ». 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

OBTENTION DES RÉSULTATS D'UNE TÂCHE

Quand vous exécutez une tâche d'arrière-plan, les résultats n'apparaissent pas immédiatement. Au lieu de cela, l'applet de commande Start-Job retourne un objet qui représente la tâche, mais ne contient pas les résultats. Pour obtenir les résultats d'une tâche d'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 tâche 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 dans la variable $results les résultats de la tâche enregistrée dans la variable $job.

$results = Receive-Job -Job $job

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 dans la variable $job, dans le fichier Results.txt.

        Receive-Job -Job $job > results.txt

OBTENTION ET CONSERVATION PARTIELLE DE RÉSULTATS DE TÂCHE

L'applet de commande Receive-Job obtient les résultats d'une tâche d'arrière-plan. Si la tâche est terminée, Receive-Job obtient tous les résultats de la tâche. Si la tâche est 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 des commandes Receive-Job pour obtenir les résultats restants.

Quand Receive-Job retourne des résultats, par défaut, il les supprime du cache où sont stockés les résultats de tâche. Si vous exécutez une autre commande Receive-Job, vous obtiendrez uniquement les résultats non encore reçus.

Les commandes suivantes montrent que les résultats des commandes Receive-Job qui sont exécutées avant que la tâche ne soit terminée.

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 empêcher Receive-Job de supprimer les résultats de tâche qu'il a retournés, utilisez le paramètre Keep. Receive-Job retournera alors tous les résultats qui ont été générés jusqu'à présent.

Les commandes suivantes montrent l'effet 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 DES RÉSULTATS

Si vous exécutez une commande qui met du temps à se terminer, vous pouvez utiliser les propriétés de l'objet de tâche pour déterminer la fin de la tâche. La commande suivante utilise l'objet Get-Job pour obtenir toutes les tâches d'arrière-plan de la session active.

Get-Job

Les résultats s'affichent dans un tableau. 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 Syst...
        3   Job3  BackgroundJob Complete    True         localhost  dir -Path C:\* -Recurse

Dans ce cas, la propriété State révèle que Job 2 est toujours en cours d'exécution. Si vous deviez utiliser l'applet de commande Receive-Job pour obtenir les résultats de la tâche à ce moment-là, ceux-ci seraient incomplets. Vous pouvez utiliser l'applet de commande Receive-Job à plusieurs reprises pour obtenir les résultats. Par défaut, chaque fois que vous l'utilisez, vous obtenez uniquement les résultats non encore reçus. Toutefois, 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 nouveaux résultats à mesure qu'ils arrivent. Vous pouvez également attendre et vérifier l'état de la tâche ultérieurement.

Vous pouvez utiliser le paramètre Wait de l'applet de commande Receive-Job. De cette façon, l'invite de commandes ne sera pas retournée tant que la tâche ne sera pas terminée et que tous les résultats ne seront pas disponibles.

L'applet de commande Wait-Job permet également d'attendre l'ensemble ou une partie des résultats de la tâche. Wait-Job vous permet d'attendre une tâche en particulier, d'attendre toutes les tâches ou d'attendre l'une des tâches devant se terminer.

La commande suivante utilise l'applet de commande Wait-Job pour attendre une tâche avec l'ID 10.

Wait-Job -ID 10

L'invite de commandes Windows PowerShell est ainsi suspendue jusqu'à la fin de la tâche.

Vous pouvez également attendre pendant une durée prédéterminée. Cette commande utilise le paramètre Timeout pour limiter l'attente à 120 secondes. Quand le délai expire, l'invite de commandes est retournée, mais la tâche continue de s'exécuter en arrière-plan.

Wait-Job -ID 10 -Timeout 120

ARRÊT D'UNE TÂCHE

Pour arrêter une tâche d'arrière-plan, utilisez l'applet de commande Stop-Job. La commande suivante démarre une tâche pour obtenir toutes les entrées du journal des événements système. L'objet de tâche est enregistré 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 à Stop-Job la tâche située dans la variable $job.

$job | Stop-Job

SUPPRESSION D'UNE TÂCHE

Pour supprimer une tâche d'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

ANALYSE D'UN ÉCHEC DE TÂCHE

Pour savoir pourquoi une tâche a échoué, utilisez la sous-propriété Reason de l'objet de tâche.

La commande suivante démarre une tâche sans les informations d'identification requises. L'objet de tâche est enregistré 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:\S...

La commande suivante utilise la propriété Reason pour rechercher l'erreur qui a provoqué l'échec de la tâche.

         $job.ChildJobs[0].JobStateInfo.Reason

Dans ce cas, la tâche a échoué parce que l'ordinateur distant nécessitait des informations d'identification explicites pour exécuter la commande. La valeur de la propriété Reason est la suivante :

         Connecting to remote server failed with the following error 
         message : Access is denied.

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