Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Brève description
Fournit des détails sur les travaux en arrière-plan sur les ordinateurs locaux et distants.
Description longue
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_Jobset about_Remote_Jobs.
À propos des tâches 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 des commandes. 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 permettant de démarrer un travail en arrière-plan retourne un objet de travail. La requête revient immédiatement afin que vous puissiez travailler sur d'autres tâches pendant que le job d'arrière-plan s'exécute.
Toutefois, lorsque vous démarrez un travail en arrière-plan, vous n’obtenez pas les résultats immédiatement 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 créée uniquement pour exécuter le travail et qui est ensuite détruite, ou il peut s’agir d’une persistante PSSession que vous pouvez utiliser pour exécuter plusieurs travaux ou commandes connexes.
Utilisation des cmdlets job
Utilisez une commande Start-Job pour démarrer un travail en arrière-plan sur un ordinateur local.
Start-Job renvoie un objet job. Vous pouvez également obtenir des objets représentant les travaux démarrés sur l’ordinateur local à l’aide de l’applet de commande Get-Job.
Pour obtenir les résultats du travail, utilisez une commande Receive-Job. Si le travail n’est pas terminé, Receive-Job retourne des résultats partiels. Vous pouvez également utiliser l’applet de commande Wait-Job pour supprimer l’invite 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 commande Stop-Job. Pour supprimer un travail, utilisez l’applet de commande Remove-Job.
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 un travail en arrière-plan à distance, utilisez le paramètre AsJob d’une applet de commande telle que Invoke-Command, ou utilisez l’applet de commande Invoke-Command pour exécuter une commande Start-Job à distance. Vous pouvez également démarrer un travail en arrière-plan dans une session interactive.
Pour plus d'informations sur les jobs d'arrière-plan distants, voir 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 lancés à l'aide de Start-Job ou du paramètre AsJob de Invoke-Command, le travail parent est un exécutif. Elle n’exécute pas de commandes ni ne retourne aucun résultat. 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 jobs enfants sont stockés dans la propriété ChildJobs de l'objet job parent. La propriété ChildJobs peut contenir un ou plusieurs objets de travail enfant. Les objets de travail enfants ont un Name, IDet InstanceId 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 parents et enfants d'un travail, utilisez le paramètre IncludeChildJobs de la cmdlet Get-Job. Le paramètre IncludeChildJob a été introduit dans Windows PowerShell 3.0.
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 ayant une valeur State particulière, utilisez le paramètre ChildJobState de la cmdlet Get-Job. Le paramètre ChildJobState a été introduit dans Windows PowerShell 3.0.
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 sous-tâches d’une tâche sur toutes les versions de PowerShell, utilisez la propriété ChildJob de la tâche parente.
(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 commande Get-Job sur la sous-tâche, comme indiqué dans la commande suivante :
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-Jobpour 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 de
Invoke-Commandpour 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-Commandpour exécuter une commandeStart-Jobsur 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 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 une tâche parente, vous gérez également les tâches enfants associées. 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 les travaux enfants individuellement. Cette fonction est particulièrement utile lorsque vous souhaitez enquêter sur un problème lié à un travail ou obtenir les résultats d'un seul des nombreux travaux enfants démarrés à l'aide du paramètre AsJob de Invoke-Command.
La commande suivante utilise le paramètre AsJob de Invoke-Command pour démarrer des travaux en arrière-plan sur l’ordinateur local et deux ordinateurs distants. La commande enregistre le travail dans la variable $j.
$invokeCommandSplat = @{
ComputerName = 'localhost', 'Server01', 'Server02'
ScriptBlock = {Get-Date}
AsJob = $true
}
$j = Invoke-Command @invokeCommandSplat
Lorsque vous affichez les propriétés Name et ChildJob de la tâche dans $j, il indique que la commande a retourné un objet de tâche avec trois sous-tâches, une pour chaque ordinateur.
$j | Format-List Name, ChildJobs
Name : Job3
ChildJobs : {Job4, Job5, Job6}
Lorsque vous affichez le job parent, il indique que le job a échoué.
$j
Id Name PSJobTypeName State HasMoreData Location
-- ---- ------------- ----- ----------- --------
3 Job3 RemotingJob Failed False localhost,Server...
Cependant, lorsque vous exécutez une commande Get-Job qui récupère les travaux enfants, la sortie indique qu'un seul travail enfant a échoué.
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 la cmdlet Receive-Job pour obtenir les résultats du travail parent. Mais vous pouvez également obtenir les résultats d'un travail enfant particulier, comme le montre la commande suivante.
Receive-Job -Name Job6 -Keep |
Format-Table ComputerName, DateTime -AutoSize
ComputerName DateTime
------------ --------
Server02 Thursday, March 13, 2008 4:16:03 PM
La fonctionnalité des jobs enfants des jobs d'arrière-plan PowerShell vous permet de mieux contrôler les jobs 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 de source de travail » qui ajoutent de nouveaux types de travaux à PowerShell et incluent les adaptateurs sources 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 workflow peuvent être suspendus et repris.
Les applets de commande que vous utilisez pour gérer les travaux personnalisés dépendent du type de travail. Pour certains d'entre eux, vous utilisez les cmdlets de travail standard, telles que Get-Job et Start-Job.
D'autres sont accompagnés de cmdlets spécialisées qui ne gèrent qu'un type de travail particulier.
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 tâche, utilisez l’applet de commande Get-Job.
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.
La liste suivante décrit les types de travaux PowerShell intégrés.
-
BackgroundJob : démarré à l’aide de l’applet de commande
Start-Job. -
RemoteJob : démarré à l’aide du paramètre AsJob de l’applet de commande
Invoke-Command. - 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’aide de
Register-ObjectEventet en spécifiant une action avec le paramètre Action.
Remarque
Avant d’utiliser l’applet de commande Get-Job 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 ne peut pas obtenir de travaux de ce type.
Windows PowerShell 5.1 inclut les types de travaux supplémentaires suivants.
- 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.
Ces types de travaux sont disponibles uniquement dans Windows PowerShell 5.1. Les modules qui ajoutent ces types de travaux ne sont pas compatibles avec PowerShell 6.0 et versions ultérieures.
Pour plus d’informations, consultez les articles suivants :
Examples
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é. Il utilise ensuite la cmdlet Get-Job pour obtenir les travaux.
Get-Job n’obtient pas le travail planifié, mais il obtient 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.
$invokeCommandSplat = @{
ComputerName = 'Server01'
AsJob = $true
JobName = 'RemoteData'
ScriptBlock = {Get-Process}
}
Invoke-Command @invokeCommandSplat
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 RemoteData RemoteJob Running True Server01 Get-Process