Recherche…


Introduction

Des travaux ont été introduits dans PowerShell 2.0 et ont permis de résoudre un problème inhérent aux outils de ligne de commande. En bref, si vous lancez une longue tâche, votre invite est indisponible jusqu'à la fin de la tâche. À titre d'exemple d'une longue tâche, pensez à cette simple commande PowerShell:

Get-ChildItem -Path c: \ -Recurse

Il faudra un certain temps pour récupérer la liste complète des répertoires de votre lecteur C :. Si vous l'exécutez en tant que Job, la console récupérera le contrôle et vous pourrez capturer le résultat ultérieurement.

Remarques

Les jobs PowerShell s'exécutent dans un nouveau processus. Cela a des avantages et des inconvénients qui sont liés.

Avantages:

  1. Le travail s'exécute dans un processus propre, y compris l'environnement.
  2. Le travail peut être exécuté de manière asynchrone sur votre processus PowerShell principal

Les inconvénients:

  1. Les modifications de l'environnement de processus ne seront pas présentes dans le travail.
  2. Les paramètres transmis et les résultats renvoyés sont sérialisés.
    • Cela signifie que si vous modifiez un objet de paramètre pendant l'exécution du travail, il ne sera pas répercuté dans le travail.
    • Cela signifie également que si un objet ne peut pas être sérialisé, vous ne pouvez ni le transmettre ni le renvoyer (bien que PowerShell puisse copier des paramètres et transmettre / renvoyer un objet PSObject).

Création d'emplois de base

Commencez un bloc de script en tâche de fond:

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

Lancer un script en tâche de fond:

$job = Start-Job -FilePath "C:\YourFolder\Script.ps1"

Démarrez un travail en utilisant Invoke-Command sur un ordinateur distant:

$job = Invoke-Command -ComputerName "ComputerName" -ScriptBlock {Get-Service winrm} -JobName "WinRM" -ThrottleLimit 16 -AsJob

Démarrer le travail en tant qu'utilisateur différent (invite le mot de passe):

Start-Job -ScriptBlock {Get-Process} -Credential "Domain\Username"

Ou

Start-Job -ScriptBlock {Get-Process} -Credential (Get-Credential)

Démarrer le travail en tant qu'utilisateur différent (pas d'invite):

$username = "Domain\Username" 
$password = "password"
$secPassword = ConvertTo-SecureString -String $password -AsPlainText -Force
$credentials = New-Object System.Management.Automation.PSCredential -ArgumentList @($username, $secPassword)
Start-Job -ScriptBlock {Get-Process} -Credential $credentials

Gestion de base

Obtenez une liste de tous les travaux de la session en cours:

Get-Job

En attente d'un travail pour terminer avant d'obtenir le résultat:

$job | Wait-job | Receive-Job 

Expire un travail s'il est trop long (10 secondes dans cet exemple)

$job | Wait-job -Timeout 10

Arrêt d'un travail (termine toutes les tâches en attente dans cette file d'attente avant la fin):

$job | Stop-Job 

Supprimer le travail de la liste des travaux en arrière-plan de la session en cours:

$job | Remove-Job

Remarque : Les éléments suivants ne fonctionnent que sur les travaux de Workflow .

Suspendre un job de Workflow (Pause):

$job | Suspend-Job 

Reprendre un job de Workflow :

$job | Resume-Job 


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow