Geek School Apprenez à utiliser des emplois dans PowerShell
PowerShell comporte quatre types de travaux: les travaux en arrière-plan, les travaux à distance, les travaux WMI et les travaux planifiés. Rejoignez-nous pour découvrir ce qu’ils sont et comment nous pouvons les utiliser.
Assurez-vous de lire les articles précédents de la série:
- Apprenez à automatiser Windows avec PowerShell
- Apprendre à utiliser les cmdlets dans PowerShell
- Apprendre à utiliser des objets dans PowerShell
- Apprentissage du formatage, du filtrage et de la comparaison dans PowerShell
- Apprendre à utiliser la communication à distance dans PowerShell
- Utilisation de PowerShell pour obtenir des informations sur l'ordinateur
- Utilisation de collections dans PowerShell
Et restez à l'écoute pour le reste de la série toute la semaine.
Travaux en arrière-plan
Jusqu'à présent, tout ce que je vous ai montré dans PowerShell était synchrone, ce qui signifie que nous tapons quelque chose dans le shell et que nous ne pouvons pas en faire grand chose tant que cette commande n'est pas terminée. C’est là que les tâches d’arrière-plan entrent en jeu. Pour créer une tâche d’arrière-plan, il suffit de passer un bloc de script à la cmdlet Start-Job..
Start-Job -Name GetFileList -Scriptblock Get-ChildItem C: \ -Recurse
Maintenant, nous sommes libres de faire ce que nous voulons dans le shell pendant que ce bloc de script s'exécute en arrière-plan.
Lorsque vous lancez un nouveau travail, PowerShell crée un nouvel objet de travail qui représente ce travail. Vous pouvez obtenir la liste de tous les travaux à tout moment en exécutant l'applet de commande Get-Job..
Les objets de travail vous renseignent sur l'état des travaux. Par exemple, dans la capture d'écran ci-dessus, nous pouvons voir que nous avons un BackgroundJob appelé GetFileList qui est toujours en cours d'exécution, mais qui a déjà commencé à renvoyer des données. Si, à un moment quelconque, vous décidez que le travail est en cours d'exécution depuis trop longtemps, vous pouvez facilement l'arrêter en le connectant à Stop-Job..
Get-Job -Name GetFileList | Stop-Job
Cependant, une fois que vous avez arrêté un travail, les données qu'il a reçues jusqu'au moment de son arrêt sont toujours disponibles. Il y a un truc, cependant. Dans PowerShell, une fois que vous recevez les résultats d'un travail, ils sont supprimés. Pour qu'ils restent, vous devez spécifier le paramètre keep switch de Receive-Job..
Get-Job -Name GetFileList | Recevoir-Emploi-Garder
Une fois que vous avez terminé votre travail, il est préférable de le supprimer. Pour supprimer le travail, il suffit de le diriger vers l'applet de commande Remove-Job..
Get-Job -Name GetFileList | Remove-Job
Cela le supprimera de la liste des travaux renvoyés par Get-Job..
Travaux à distance
Il y a quelques leçons, nous avons vu comment utiliser la communication à distance pour exécuter des commandes PowerShell sur une machine distante à l'aide de Invoke-Command, mais saviez-vous que vous pouvez également utiliser Invoke-Command pour lancer un travail de communication à distance en arrière-plan? Pour ce faire, ajoutez simplement le paramètre -AsJob à la fin de votre commande:
Invoke-Command -ComputerName Flash, Viper -Administrateur accrédité -ScriptBlock gci -AsJob
C’était une commande simple qui aurait dû être exécutée maintenant, jetons donc un coup d’œil à l’état de nos travaux..
Hmm, on dirait que ça a échoué. Cela m'amène à mon premier casse-tête avec des emplois. Lorsque vous créez un nouveau travail, quel que soit son type, dans PowerShell, il crée un travail parent en plus d'un travail enfant pour chaque ordinateur sur lequel vous l'exécutez. Lorsque vous utilisez la cmdlet Get-Job, elle affiche uniquement les travaux parents et la propriété state est le pire des scénarios. Ainsi, même si la commande ne pouvait pas s'exécuter sur un ordinateur sur cent, l'état des travaux parents indiquera échoué. Pour voir une liste des travaux enfants, vous devez utiliser le paramètre IncludeChildJob..
Si vous regardez de plus près, vous verrez que le travail n'a en effet échoué que sur un ordinateur, ce qui nous amène au prochain. Lorsque vous essayez d'obtenir les résultats du travail, si vous spécifiez le nom ou l'ID du travail du parent, PowerShell renverra les données de tous les travaux enfants. Le problème est que s'il y a une erreur dans l'un des jobs enfants, nous allons nous retrouver avec du texte rouge.
Il y a deux façons de contourner cela. Tout d'abord, si vous connaissez les ordinateurs pour lesquels vous souhaitez obtenir les résultats, vous pouvez simplement utiliser le paramètre ComputerName de la cmdlet Recieve -Job..
Get-Job -Id 3 | Receive-Job -Keep -ComputerName Viper
Sinon, vous pouvez obtenir les résultats d'un travail enfant spécifique à l'aide de son ID de travail..
Get-Job -Id 3 -IncludeChildJob
Get-Job -Id 5 | Recevoir-Emploi-Garder
Emplois WMI
Les tâches WMI sont très similaires aux tâches distantes, nécessitant uniquement que le paramètre -AsJob soit ajouté à la cmdlet Get-WmiObject..
Malheureusement, cela signifie qu'ils sont également soumis aux mêmes pièges que ceux mentionnés dans la section Travaux à distance..
Travaux planifiés
Les trois derniers types de travaux que nous avons examinés n'étaient pas persistants, ce qui signifie qu'ils ne sont disponibles que dans votre session actuelle. En gros, cela signifie que si vous démarrez un travail, puis ouvrez une autre console PowerShell et exécutez Get-Job, vous ne verrez aucun travail. Cependant, revenez à la console à partir de laquelle le travail a été lancé, vous pourrez voir son statut. Cela contraste avec les travaux planifiés qui sont persistants. Fondamentalement, un travail planifié est un bloc de script qui s'exécute selon un planning. Par le passé, le planificateur de tâches de Windows aurait eu le même effet, ce qui est en réalité ce qui se passe sous le capot. Pour créer un nouveau travail planifié, procédez comme suit:
Register-ScheduledJob -Name GetEventLogs -ScriptBlock Get-EventLog -LogName Security -Newest 100 -Trigger (New-JobTrigger -Daily -À 17h) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
Il y a beaucoup de choses dans cette commande, alors décomposons-les.
- Tout d'abord, nous attribuons à notre travail planifié le nom de GetEventLogs.
- Nous lui indiquons ensuite que, une fois déclenché, nous voulons qu’il exécute le contenu du bloc de script spécifié, qui obtient en gros les 100 dernières entrées du journal des événements de sécurité..
- Ensuite, nous spécifions un déclencheur. Comme le paramètre trigger utilise un objet trigger en entrée, nous avons utilisé une commande entre parenthèses pour générer un trigger qui sera déclenché tous les jours à 17 heures..
- Étant donné que nous traitons du journal des événements, nous devons l'exécuter en tant qu'administrateur, ce que nous pouvons spécifier en créant un nouvel objet ScheduledJobOption et en le transmettant au paramètre ScheduledJobOption..
Comme il s'agit d'un type de travail légèrement différent, vous devrez également utiliser une commande différente pour extraire une liste de tous les travaux planifiés sur une machine..
Get-ScheduledJob
C'est tout ce qu'on peut en dire.