À propos des détails du travail

Description courte

Fournit des détails sur les travaux en arrière-plan sur les ordinateurs locaux et distants.

Description détaillée

Cette rubrique explique le concept d’un travail en arrière-plan et fournit des informations techniques sur le fonctionnement des travaux en arrière-plan dans PowerShell.

Cette rubrique est un supplément aux rubriques about_Jobs, about_Thread_Jobs et about_Remote_Jobs .

À propos des travaux en arrière-plan

Un travail en arrière-plan exécute une commande ou une expression de façon asynchrone. Il peut exécuter une applet de commande, une fonction, un script ou toute autre tâche basée sur la commande. Il est conçu pour exécuter des commandes qui prennent une période prolongée, mais vous pouvez l’utiliser pour exécuter n’importe quelle commande en arrière-plan.

Lorsqu’une commande synchrone s’exécute, l’invite de commandes PowerShell est supprimée jusqu’à ce que la commande soit terminée. Toutefois, une tâche en arrière-plan ne supprime pas l’invite PowerShell. Une commande pour démarrer un travail en arrière-plan retourne un objet de travail. L’invite retourne immédiatement afin que vous puissiez travailler sur d’autres tâches pendant que le travail en arrière-plan s’exécute.

Toutefois, lorsque vous démarrez un travail en arrière-plan, vous n’obtenez pas immédiatement les résultats même si le travail s’exécute très rapidement. L’objet de travail retourné contient des informations utiles sur le travail, mais il ne contient pas les résultats du travail. Vous devez exécuter une commande distincte pour obtenir les résultats du travail. Vous pouvez également exécuter des commandes pour arrêter le travail, attendre que le travail soit terminé et supprimer le travail.

Pour rendre le minutage d’un travail en arrière-plan indépendant des autres commandes, chaque travail en arrière-plan s’exécute dans sa propre session PowerShell. Toutefois, il peut s’agir d’une connexion temporaire qui est créée uniquement pour exécuter le travail, puis détruite, ou il peut s’agir d’une session PSSession persistante que vous pouvez utiliser pour exécuter plusieurs travaux ou commandes connexes.

Utilisation des applets de commande de travail

Utilisez une commande pour démarrer un Start-Job travail en arrière-plan sur un ordinateur local. Start-Job retourne un objet de travail. Vous pouvez également obtenir des objets représentant les travaux démarrés sur l’ordinateur local à l’aide de l’applet de Get-Job commande.

Pour obtenir les résultats du travail, utilisez une Receive-Job commande. Si le travail n’est pas terminé, Receive-Job retourne des résultats partiels. Vous pouvez également utiliser l’applet de commande pour supprimer l’invite Wait-Job de commandes jusqu’à ce que l’un ou l’ensemble des travaux démarrés dans la session soient terminés.

Pour arrêter un travail en arrière-plan, utilisez l’applet de Stop-Job commande. Pour supprimer un travail, utilisez l’applet de Remove-Job commande.

Pour plus d’informations sur le fonctionnement des applets de commande, consultez la rubrique d’aide de chaque applet de commande et consultez about_Jobs.

Démarrage de travaux en arrière-plan sur des ordinateurs distants

Vous pouvez créer et gérer des travaux en arrière-plan sur un ordinateur local ou distant. Pour exécuter une tâche en arrière-plan à distance, utilisez le paramètre AsJob d’une applet de commande telle que Invoke-Command, ou utilisez l’applet Invoke-Command de commande pour exécuter une Start-Job commande à distance. Vous pouvez également démarrer un travail en arrière-plan dans une session interactive.

Pour plus d’informations sur les travaux en arrière-plan distants, consultez about_Remote_Jobs.

Travaux enfants

Chaque travail en arrière-plan se compose d’un travail parent et d’un ou plusieurs travaux enfants. Dans les travaux démarrés à l’aide Start-Job ou le paramètre AsJob de Invoke-Command, le travail parent est un exécutif. Il n’exécute aucune commande ni retourne les résultats. Les commandes sont en fait exécutées par les travaux enfants. Les travaux démarrés à l’aide d’autres applets de commande peuvent fonctionner différemment.

Les travaux enfants sont stockés dans la propriété ChildJobs de l’objet de travail parent. La propriété ChildJobs peut contenir un ou plusieurs objets de travail enfants. Les objets de travail enfants ont un nom, un ID et un Id d’instance qui diffèrent du travail parent afin que vous puissiez gérer les travaux parent et enfants individuellement ou en tant qu’unité.

Pour obtenir les travaux parent et enfant d’un travail, utilisez le paramètre IncludeChildJobs de l’applet Get-Job de commande. Le paramètre IncludeChildJob a été introduit dans Windows PowerShell 3.0.

PS> Get-Job -IncludeChildJob

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
1  Job1   RemoteJob     Failed     True          localhost   Get-Process
2  Job2                 Completed  True          Server01    Get-Process
3  Job3                 Failed     False         localhost   Get-Process

Pour obtenir le travail parent et uniquement les travaux enfants avec une valeur d’état particulière, utilisez le paramètre ChildJobState de l’applet Get-Job de commande. Le paramètre ChildJobState a été introduit dans Windows PowerShell 3.0.

PS> Get-Job -ChildJobState Failed

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
1  Job1   RemoteJob     Failed     True          localhost   Get-Process
3  Job3                 Failed     False         localhost   Get-Process

Pour obtenir les travaux enfants d’un travail sur toutes les versions de PowerShell, utilisez la propriété ChildJob du travail parent.

PS> (Get-Job Job1).ChildJobs

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
2  Job2                 Completed  True          Server01    Get-Process
3  Job3                 Failed     False         localhost   Get-Process

Vous pouvez également utiliser une Get-Job commande sur le travail enfant, comme illustré dans la commande suivante :

PS> Get-Job Job3

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
3  Job3                 Failed     False         localhost   Get-Process

La configuration du travail enfant dépend de la commande que vous utilisez pour démarrer le travail.

  • Lorsque vous utilisez Start-Job pour démarrer un travail sur un ordinateur local, le travail se compose d’un travail parent exécutif et d’un travail enfant qui exécute la commande.

  • Lorsque vous utilisez le paramètre AsJob pour Invoke-Command démarrer un travail sur un ou plusieurs ordinateurs, le travail se compose d’un travail parent exécutif et d’un travail enfant pour chaque travail exécuté sur chaque ordinateur.

  • Lorsque vous utilisez Invoke-Command pour exécuter une Start-Job commande sur un ou plusieurs ordinateurs distants, le résultat est identique à une commande locale exécutée sur chaque ordinateur distant. La commande retourne un objet de travail pour chaque ordinateur. L’objet de travail se compose d’un travail parent exécutif et d’un travail enfant qui exécute la commande.

Le travail parent représente tous les travaux enfants. Lorsque vous gérez un travail parent, vous gérez également les travaux enfants associés. Par exemple, si vous arrêtez un travail parent, tous les travaux enfants sont arrêtés. Si vous obtenez les résultats d’un travail parent, vous obtenez les résultats de tous les travaux enfants.

Toutefois, vous pouvez également gérer des travaux enfants individuellement. Cela est le plus utile lorsque vous souhaitez examiner un problème avec un travail ou obtenir les résultats d’un seul des travaux enfants démarré à l’aide du paramètre AsJob de Invoke-Command.

La commande suivante utilise le paramètre AsJob pour Invoke-Command démarrer des travaux en arrière-plan sur l’ordinateur local et deux ordinateurs distants. La commande enregistre le travail dans la $j variable.

PS> $j = Invoke-Command -ComputerName localhost, Server01, Server02 `
-Command {Get-Date} -AsJob

Lorsque vous affichez les propriétés Name et ChildJob de la tâche dans $j, elle indique que la commande a retourné un objet de travail avec trois travaux enfants, un pour chaque ordinateur.

PS> $j | Format-List Name, ChildJobs

Name      : Job3
ChildJobs : {Job4, Job5, Job6}

Lorsque vous affichez le travail parent, celui-ci indique que le travail a échoué.

PS> $j

Id Name   PSJobTypeName State      HasMoreData   Location
-- ----   ------------- -----      -----------   --------
3  Job3   RemotingJob   Failed     False         localhost,Server...

Toutefois, lorsque vous exécutez une Get-Job commande qui obtient les travaux enfants, la sortie indique qu’un seul travail enfant a échoué.

PS> Get-Job -IncludeChildJobs

Id  Name   PSJobTypeName State      HasMoreData   Location    Command
--  ----   ------------- -----      -----------   --------    -------
3   Job3   RemotingJob   Failed     False         localhost,Server...
4   Job4                 Completed  True          localhost   Get-Date
5   Job5                 Failed     False         Server01    Get-Date
6   Job6                 Completed  True          Server02    Get-Date

Pour obtenir les résultats de tous les travaux enfants, utilisez l’applet Receive-Job de commande pour obtenir les résultats du travail parent. Toutefois, vous pouvez également obtenir les résultats d’un travail enfant particulier, comme illustré dans la commande suivante.

PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName,
>> DateTime -AutoSize
ComputerName DateTime
------------ --------
Server02     Thursday, March 13, 2008 4:16:03 PM

La fonctionnalité de travaux enfants des travaux en arrière-plan PowerShell vous donne plus de contrôle sur les travaux que vous exécutez.

Types de travaux

PowerShell prend en charge différents types de travaux pour différentes tâches. À compter de Windows PowerShell 3.0, les développeurs peuvent écrire des « adaptateurs sources de travail » qui ajoutent de nouveaux types de travaux à PowerShell et incluent les adaptateurs source de travail dans les modules. Lorsque vous importez le module, vous pouvez utiliser le nouveau type de travail dans votre session.

Par exemple, le module PSScheduledJob ajoute des travaux planifiés et le module PSWorkflow ajoute des travaux de flux de travail.

Les types de travaux personnalisés peuvent différer considérablement des travaux en arrière-plan PowerShell standard. Par exemple, les travaux planifiés sont enregistrés sur le disque; ils n’existent pas seulement dans une session particulière. Les travaux de flux de travail peuvent être suspendus et repris.

Les applets de commande que vous utilisez pour gérer des travaux personnalisés dépendent du type de travail. Pour certains, vous utilisez les applets de commande de travail standard, telles que Get-Job et Start-Job. D’autres sont fournis avec des applets de commande spécialisées qui gèrent uniquement un type particulier de travail. Pour plus d’informations sur les types de travaux personnalisés, consultez les rubriques d’aide sur le type de travail.

Pour rechercher le type de travail d’un travail, utilisez l’applet Get-Job de commande. Get-Job retourne différents objets de travail pour différents types de travaux. La valeur de la propriété PSJobTypeName des objets de travail qui Get-Job retourne indique le type de travail.

Le tableau suivant répertorie les types de travaux fournis avec PowerShell.

Type de travail Description
BackgroundJob Démarré à l’aide de l’applet de Start-Job commande.
RemoteJob Démarré à l’aide du paramètre AsJob du
Invoke-Command.
PSWorkflowJob Démarré à l’aide du paramètre AsJob d’un flux de travail.
PSScheduledJob Instance d’un travail planifié démarré par un déclencheur de travail.
CIMJob Démarré à l’aide du paramètre AsJob d’une applet de commande à partir d’un
Module CDXML.
WMIJob Démarré à l’aide du paramètre AsJob d’une applet de commande à partir d’un
Module WMI.
PSEventJob Créé à l’aideRegister-ObjectEvent et en spécifiant un
action avec le paramètre Action .

REMARQUE : Avant d’utiliser l’applet Get-Job de commande pour obtenir des travaux d’un type particulier, vérifiez que le module qui ajoute le type de travail est importé dans la session active. Sinon, Get-Job n’obtient pas de travaux de ce type.

Exemples

Les commandes suivantes créent un travail en arrière-plan local, un travail en arrière-plan distant, un travail de flux de travail et un travail planifié. Ensuite, il utilise l’applet Get-Job de commande pour obtenir les travaux. Get-Job n’obtient pas le travail planifié, mais il obtient toutes les instances démarrées du travail planifié.

Démarrez un travail en arrière-plan sur l’ordinateur local.

PS> Start-Job -Name LocalData {Get-Process}

Id Name        PSJobTypeName   State   HasMoreData   Location   Command
-- ----        -------------   -----   -----------   --------   -------
2  LocalData   BackgroundJob   Running        True   localhost  Get-Process

Démarrez un travail en arrière-plan qui s’exécute sur un ordinateur distant.

PS> Invoke-Command -ComputerName Server01 {Get-Process} `
-AsJob -JobName RemoteData

Id  Name        PSJobTypeName  State   HasMoreData   Location   Command
--  ----        -------------  -----   -----------   --------   -------
2   RemoteData  RemoteJob      Running        True   Server01   Get-Process

Créer une tâche planifiée

PS>  Register-ScheduledJob -Name ScheduledJob -ScriptBlock `
 {Get-Process} -Trigger (New-JobTrigger -Once -At "3 PM")

Id         Name            JobTriggers     Command       Enabled
--         ----            -----------     -------       -------
1          ScheduledJob    1               Get-Process   True

Créez un flux de travail.

PS> workflow Test-Workflow {Get-Process}

Exécutez le flux de travail en tant que travail.


PS> Test-Workflow -AsJob -JobName TestWFJob

Id  Name       PSJobTypeName   State   HasMoreData   Location   Command
--  ----       -------------   -----   -----------   --------   -------
2   TestWFJob  PSWorkflowJob   NotStarted     True   localhost  Get-Process

Obtenez les travaux. La Get-Job commande n’obtient pas de travaux planifiés, mais obtient des instances du travail planifié démarré.

PS> Get-Job

Id  Name         PSJobTypeName  State     HasMoreData  Location  Command
--  ----         -------------  -----     -----------  --------  -------
2   LocalData    BackgroundJob  Completed True         localhost Get-Process
4   RemoteData   RemoteJob      Completed True         Server01  Get-Process
6   TestWFJob    PSWorkflowJob  Completed True         localhost WorkflowJob
8   ScheduledJob PSScheduledJob Completed True         localhost Get-Process

Pour obtenir des travaux planifiés, utilisez l’applet de Get-ScheduledJob commande.

PS> Get-ScheduledJob

Id         Name            JobTriggers     Command       Enabled
--         ----            -----------     -------       -------
1          ScheduledJob    1               Get-Process   True

Voir aussi