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
Décrit comment exécuter des travaux en arrière-plan sur des ordinateurs distants.
Description longue
PowerShell exécute simultanément des commandes et des scripts via des travaux. Il existe trois types de travaux fournis par PowerShell pour prendre en charge la concurrence.
-
RemoteJob- Les commandes et les scripts s’exécutent dans une session distante. -
BackgroundJob- Les commandes et les scripts s’exécutent dans un processus distinct sur l’ordinateur local. Pour plus d’informations, consultez à propos des_tâches. -
PSTaskJobouThreadJob- Les commandes et les scripts s’exécutent dans un thread distinct au sein du même processus sur l’ordinateur local. Pour plus d’informations, consultez about_Thread_Jobs.
L’exécution de scripts à distance, sur un ordinateur distinct ou dans un processus distinct, offre une grande isolation. Les erreurs qui se produisent dans le travail distant n’affectent pas d’autres travaux en cours d’exécution ou la session parente qui a démarré le travail. Toutefois, la couche de communication à distance ajoute une surcharge, y compris la sérialisation d’objets. Tous les objets sont sérialisés et désérialisés, car ils sont passés entre la session parente et la session distante (travail). La sérialisation d’objets de données complexes volumineux peut consommer de grandes quantités de ressources de calcul et de mémoire et transférer de grandes quantités de données sur le réseau.
Important
La session parente qui a créé le travail surveille également l’état du travail et collecte les données de pipeline. Le processus enfant du travail est arrêté par le processus parent une fois que le travail atteint un état terminé. Si la session parente est arrêtée, tous les travaux enfants en cours d’exécution sont arrêtés avec leurs processus enfants.
Il existe deux façons de contourner cette situation :
- Permet
Invoke-Commandde créer des travaux qui s’exécutent dans des sessions déconnectées. Consultez la section processus détachés de cet article. - Permet
Start-Processde créer un processus plutôt qu’un travail. Pour plus d’informations, consultez Start-Process.
Travaux distants
Vous pouvez exécuter des travaux sur des ordinateurs distants à l’aide de trois méthodes différentes.
Démarrez une session interactive sur un ordinateur distant. Démarrez ensuite un travail dans la session interactive. Les procédures sont identiques à l’exécution d’un travail local, bien que toutes les actions soient effectuées sur l’ordinateur distant.
Exécutez un travail sur un ordinateur distant qui retourne ses résultats à l’ordinateur local. Utilisez cette méthode lorsque vous souhaitez collecter les résultats des travaux et les gérer dans un emplacement central sur l’ordinateur local.
Exécutez un travail sur un ordinateur distant qui conserve ses résultats sur l’ordinateur distant. Utilisez cette méthode lorsque les données du travail sont conservées de manière plus sécurisée sur l’ordinateur d’origine.
Démarrer un travail dans une session interactive
Vous pouvez démarrer une session interactive avec un ordinateur distant, puis démarrer un travail pendant la session interactive. Pour plus d’informations sur les sessions interactives, consultez about_Remote et consultez Enter-PSSession.
La procédure de démarrage d’un travail dans une session interactive est presque identique à la procédure de démarrage d’un travail en arrière-plan sur l’ordinateur local. Toutefois, toutes les opérations se produisent sur l’ordinateur distant, et non sur l’ordinateur local.
Utilisez l’applet
Enter-PSSessionde commande pour démarrer une session interactive avec un ordinateur distant. Vous pouvez utiliser le paramètre ComputerName pourEnter-PSSessionétablir une connexion temporaire pour la session interactive. Vous pouvez également utiliser le paramètre Session pour exécuter la session interactive dans une session PowerShell (PSSession).La commande suivante démarre une session interactive sur l’ordinateur Server01.
C:\PS> Enter-PSSession -ComputerName Server01L’invite de commandes change pour indiquer que vous êtes maintenant connecté à l’ordinateur Server01.
Server01\C:>Pour démarrer un travail distant dans la session, utilisez l’applet de
Start-Jobcommande. La commande suivante exécute un travail distant qui obtient les événements dans le journal des événements Windows PowerShell sur l’ordinateur Server01. L’appletStart-Jobde commande retourne un objet qui représente le travail.Cette commande enregistre l’objet de travail dans la
$jobvariable.Server01\C:> $job = Start-Job -ScriptBlock { Get-EventLog "Windows PowerShell" }Pendant l’exécution du travail, vous pouvez utiliser la session interactive pour exécuter d’autres commandes, y compris d’autres travaux. Toutefois, vous devez conserver la session interactive ouverte jusqu’à ce que le travail soit terminé. Si vous terminez la session, le travail est interrompu et les résultats sont perdus.
Pour savoir si le travail est terminé, affichez la valeur de la
$jobvariable ou utilisez l’appletGet-Jobde commande pour obtenir le travail. La commande suivante utilise l’appletGet-Jobde commande pour afficher le travail.Server01\C:> Get-Job $job SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Complete True localhost Get-EventLog "Windows...La
Get-Jobsortie indique que le travail s’exécute sur l’ordinateur « localhost », car le travail a été démarré et s’exécute sur le même ordinateur (dans ce cas, Server01).Pour obtenir les résultats du travail, utilisez l’applet
Receive-Jobde commande. Vous pouvez afficher les résultats dans la session interactive ou les enregistrer dans un fichier sur l’ordinateur distant. La commande suivante obtient les résultats du travail dans la variable $job. La commande utilise l’opérateur de redirection (>) pour enregistrer les résultats du travail dans le fichier PsLog.txt sur l’ordinateur Server01.Server01\C:> Receive-Job $job > C:\logs\PsLog.txtPour mettre fin à la session interactive, utilisez l’applet de
Exit-PSSessioncommande. L’invite de commandes change pour indiquer que vous êtes de retour dans la session d’origine sur l’ordinateur local.Server01\C:> Exit-PSSession C:\PS>Pour afficher le contenu du
PsLog.txtfichier sur l’ordinateur Server01 à tout moment, démarrez une autre session interactive ou exécutez une commande distante. Ce type de commande est préférable à exécuter dans une session PSSession (connexion persistante) au cas où vous souhaitez utiliser plusieurs commandes pour examiner et gérer les données dans lePsLog.txtfichier. Pour plus d’informations sur les sessions PSSession, consultez about_PSSessions.Les commandes suivantes utilisent l’applet
New-PSSessionde commande pour créer une session PSSession connectée à l’ordinateur Server01, et elles utilisent l’appletInvoke-Commandde commande pour exécuter uneGet-Contentcommande dans PSSession pour afficher le contenu du fichier.$s = New-PSSession -ComputerName Server01 Invoke-Command -Session $s -ScriptBlock { Get-Content C:\logs\pslog.txt}
Démarrer un travail distant qui retourne les résultats à l’ordinateur local (AsJob)
Pour démarrer un travail sur un ordinateur distant qui retourne les résultats de la commande à l’ordinateur local, utilisez le paramètre AsJob d’une applet de commande telle que l’applet Invoke-Command de commande.
Lorsque vous utilisez le paramètre AsJob , l’objet de travail est réellement créé sur l’ordinateur local même si le travail s’exécute sur l’ordinateur distant. Une fois le travail terminé, les résultats sont retournés à l’ordinateur local.
Vous pouvez utiliser les applets de commande qui contiennent le nom du travail (applets de commande job) pour gérer n’importe quel travail créé par n’importe quelle applet de commande. La plupart des applets de commande qui ont des paramètres AsJob n’utilisent pas la communication à distance PowerShell. Vous pouvez donc les utiliser même sur les ordinateurs qui ne sont pas configurés pour la communication à distance et qui ne répondent pas aux conditions requises pour la communication à distance.
La commande suivante utilise le paramètre AsJob pour
Invoke-Commanddémarrer un travail sur l’ordinateur Server01. Le travail exécute uneGet-Eventlogcommande qui obtient les événements dans le journal système. Vous pouvez utiliser le paramètre JobName pour affecter un nom complet au travail.Invoke-Command -ComputerName Server01 -ScriptBlock { Get-EventLog System} -AsJobLes résultats de la commande ressemblent à l’exemple de sortie suivant.
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Running True Server01 Get-EventLog SystemLorsque le paramètre AsJob est utilisé,
Invoke-Commandretourne le même type d’objet de travail que celui retournéStart-Job. Vous pouvez enregistrer l’objet de travail dans une variable ou utiliser uneGet-Jobcommande pour obtenir le travail.Notez que la valeur de la propriété Location indique que le travail s’est exécuté sur l’ordinateur Server01.
Pour gérer un travail démarré à l’aide du paramètre AsJob de l’applet
Invoke-Commandde commande, utilisez les applets de commande Job. Étant donné que l’objet de travail qui représente le travail distant se trouve sur l’ordinateur local, vous n’avez pas besoin d’exécuter des commandes distantes pour gérer le travail.Pour déterminer si le travail est terminé, utilisez une
Get-Jobcommande. La commande suivante obtient tous les travaux qui ont été démarrés dans la session active.Get-JobÉtant donné que le travail distant a été démarré dans la session active, une commande locale
Get-Jobobtient le travail. La propriété State de l’objet de travail indique que la commande a été effectuée correctement.SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Completed True Server01 Get-EventLog SystemPour obtenir les résultats du travail, utilisez l’applet
Receive-Jobde commande. Étant donné que les résultats du travail sont automatiquement retournés à l’ordinateur où réside l’objet de travail, vous pouvez obtenir les résultats avec une commande localeReceive-Job.La commande suivante utilise l’applet
Receive-Jobde commande pour obtenir les résultats du travail. Il utilise l’ID de session pour identifier le travail. Cette commande enregistre les résultats du travail dans la variable $results. Vous pouvez également rediriger les résultats vers un fichier.$results = Receive-Job -Id 1
Démarrer un travail distant qui conserve les résultats sur l’ordinateur distant
Pour démarrer un travail sur un ordinateur distant qui conserve les résultats de la commande sur l’ordinateur distant, utilisez l’applet Invoke-Command de commande pour exécuter une Start-Job commande sur un ordinateur distant. Vous pouvez utiliser cette méthode pour exécuter des travaux sur plusieurs ordinateurs.
Lorsque vous exécutez une Start-Job commande à distance, l’objet de travail est créé sur l’ordinateur distant et les résultats du travail sont conservés sur l’ordinateur distant.
Du point de vue du travail, toutes les opérations sont locales. Vous exécutez simplement des commandes à distance pour gérer un travail local sur l’ordinateur distant.
Utilisez l’applet
Invoke-Commandde commande pour exécuter uneStart-Jobcommande sur un ordinateur distant.Cette commande nécessite une session PSSession (connexion persistante). Si vous utilisez le paramètre ComputerName pour
Invoke-Commandétablir une connexion temporaire, laInvoke-Commandcommande est considérée comme terminée lorsque l’objet de travail est retourné. Par conséquent, la connexion temporaire est fermée et le travail est annulé.La commande suivante utilise l’applet
New-PSSessionde commande pour créer une session PSSession connectée à l’ordinateur Server01. La commande enregistre la session PSSession dans la$svariable.$s = New-PSSession -ComputerName Server01La commande suivante utilise l’applet
Invoke-Commandde commande pour exécuter uneStart-Jobcommande dans psSession. LaStart-Jobcommande et laGet-Eventlogcommande sont placées entre accolades.Invoke-Command -Session $s -ScriptBlock { Start-Job -ScriptBlock {Get-EventLog System}}Les résultats ressemblent à l’exemple de sortie suivant.
Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 2 Job2 Running True Localhost Get-EventLog SystemLorsque vous exécutez une
Start-Jobcommande à distance,Invoke-Commandretourne le même type d’objet de travail que celui retournéStart-Job. Vous pouvez enregistrer l’objet de travail dans une variable ou utiliser uneGet-Jobcommande pour obtenir le travail.Notez que la valeur de la propriété Location indique que le travail s’est exécuté sur l’ordinateur local, appelé « LocalHost », même si le travail s’est exécuté sur l’ordinateur Server01. Étant donné que l’objet de travail est créé sur l’ordinateur Server01 et que le travail s’exécute sur le même ordinateur, il est considéré comme un travail en arrière-plan local.
Pour gérer un travail distant, utilisez les applets de commande Job . Étant donné que l’objet de travail se trouve sur l’ordinateur distant, vous devez exécuter des commandes distantes pour obtenir, arrêter, attendre ou récupérer les résultats du travail.
Pour voir si le travail est terminé, utilisez une
Invoke-Commandcommande pour exécuter uneGet-Jobcommande dans la session PSSession connectée à l’ordinateur Server01.Invoke-Command -Session $s -ScriptBlock {Get-Job}La commande retourne un objet de traitement. La propriété State de l’objet de travail indique que la commande a été effectuée correctement.
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 2 Job2 Completed True LocalHost Get-EventLog SystemPour obtenir les résultats du travail, utilisez l’applet
Invoke-Commandde commande pour exécuter uneReceive-Jobcommande dans la session PSSession connectée à l’ordinateur Server01.La commande suivante utilise l’applet
Receive-Jobde commande pour obtenir les résultats du travail. Il utilise l’ID de session pour identifier le travail. Cette commande enregistre les résultats du travail dans la$resultsvariable. Il utilise le paramètre Keep pourReceive-Jobconserver le résultat dans le cache de travaux sur l’ordinateur distant.$results = Invoke-Command -Session $s -ScriptBlock { Receive-Job -SessionId 2 -Keep }Vous pouvez également rediriger les résultats vers un fichier sur l’ordinateur local ou distant. La commande suivante utilise un opérateur de redirection pour enregistrer les résultats dans un fichier sur l’ordinateur Server01.
Invoke-Command -Session $s -Command { Receive-Job -SessionId 2 > C:\logs\pslog.txt }
Comment s’exécuter en tant que processus détaché
Comme mentionné précédemment, lorsque la session parente est arrêtée, tous les travaux enfants en cours d’exécution sont arrêtés avec leurs processus enfants. Vous pouvez utiliser la communication à distance sur l’ordinateur local pour exécuter des travaux qui ne sont pas attachés à la session PowerShell actuelle.
Créez une session PowerShell sur l’ordinateur local. Utilisation Invoke-Command pour démarrer un travail dans cette session.
Invoke-Command vous permet de déconnecter une session distante et de mettre fin à la session parente. Plus tard, vous pouvez démarrer une nouvelle session PowerShell et vous connecter à la session précédemment déconnectée pour reprendre la surveillance du travail. Toutefois, toutes les données retournées à la session PowerShell d’origine sont perdues lorsque cette session est terminée. Seuls les nouveaux objets de données générés après la déconnexion sont retournés lors de la nouvelle connexion.
# Create remote session on local machine
PS> $session = New-PSSession -Cn localhost
# Start remote job
PS> $job = Invoke-Command -Session $session -ScriptBlock { 1..60 | % { sleep 1; "Output $_" } } -AsJob
PS> $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 RemoteJob Running True localhost 1..60 | % { sleep 1; ...
# Disconnect the job session
PS> Disconnect-PSSession $session
Id Name Transport ComputerName ComputerType State ConfigurationName Availability
-- ---- --------- ------------ ------------ ----- ----------------- ------------
1 Runspace1 WSMan localhost RemoteMachine Disconnected Microsoft.PowerShell None
PS> $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 RemoteJob Disconnected True localhost 1..60 | % { sleep 1;
# Reconnect the session to a new job object
PS> $jobNew = Receive-PSSession -Session $session -OutTarget Job
PS> $job | Wait-Job | Receive-Job
Output 9
Output 10
Output 11
...
Pour cet exemple, les travaux sont toujours attachés à une session PowerShell parente.
Toutefois, la session parente n’est pas la session PowerShell d’origine où Invoke-Command a été exécutée.