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, c’est-à-dire que nous tapons quelque chose dans le shell et que nous ne pouvons pas vraiment en faire beaucoup 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, transmettez simplement un bloc de script à la cmdlet Start-Job.
Start-Job –Name GetFileList –Scriptblock {Get-ChildItem C: –Recurse}
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 | Receive-Job –Keep
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 -Credential administrator -ScriptBlock {gci} –AsJob
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 avait une erreur dans l'un des jobs enfants, il nous restera du texte rouge.
Get-Job –Id 3 | Receive-Job –Keep –ComputerName Viper
Get-Job -Id 3 –IncludeChildJob
Get-Job -Id 5 | Receive-Job –Keep
Emplois WMI
Les tâches WMI sont très similaires aux tâches distantes, nécessitant l'ajout du paramètre –AsJob à la cmdlet Get-WmiObject.
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 lancez 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 tâches planifiées qui sont persistants. Fondamentalement, un travail planifié est un bloc de script qui s'exécute sur une planification. 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 -At 5pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
Il y a beaucoup de choses dans ce commandement, alors décomposons-les.
- Premièrement, 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.
- Comme 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.
Get-ScheduledJob