Comment planifier un script PowerShell avec des arguments ?
Sommaire
I. Présentation
L'automatisation de tâches en PowerShell implique généralement la mise en place de routine par l'intermédiaire des tâches planifiées, sur un environnement Windows. Sur un environnement Linux, on modifiera le crontab pour planifier l'exécution d'un script.
Ce n'est pas compliqué d'exécuter un script en tâche planifiée sur Windows, mais c'est un peu plus complexe si vous souhaitez exécuter un script PowerShell en passant des paramètres. Du moins, il faut connaître la bonne syntaxe. Voyons comment procéder.
II. Tâche planifiée avec un script PowerShell sans paramètre
Nous allons commencer par le plus simple : planifier un script, simple, sans lui passer de paramètre. Il y a plusieurs méthodes possibles. Tout d'abord, dans le planificateur de tâches, il y a la zone pour la commande à exécuter et la zone pour les éventuels arguments. En ce qui concerne le programme à exécuter, ce sera toujours ceci (ou simplement powershell.exe) :
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Ensuite pour l'argument, quand vous souhaitez simplement exécuter un script, on peut l'appeler grâce à l'argument "-File" suivi du chemin vers le script, ce qui donne :
-File "C:\Scripts\MonScript.ps1"
Maintenant, pour se rapprocher de la syntaxe que l'on va utiliser quand on voudra spécifier des paramètres, on va exécuter une commande et utiliser l'opérateur call (&). Ce qui donne "-Command" à la place de "-File" pour exécuter une commande plutôt que de lancer un script directement. L'opérateur & va nous permettre ensuite d'exécuter le script, voici la syntaxe :
-Command "& 'C:\Scripts\MonScript.ps1'"
Pour tester, n'hésitez pas à lancer manuellement votre tâche planifiée ! 🙂
III. Tâche planifiée avec un script PowerShell avec paramètres
Intéressons-nous maintenant au cas de figure qui s'avère plus compliqué au niveau de la syntaxe, encore que, il suffit de la connaitre la syntaxe ! On va tout simplement utiliser l'argument -Command et utiliser l'opérateur call pour appeler notre script suivi de ses paramètres. Le plus compliqué c'est de s'y retrouver entre les guillemets et les apostrophes... Mettez tout le bloc Command entre guillemet, et à l'intérieur délimitez vos chaînes de caractères avec les apostrophes.
Pour exécuter le script MonScript.ps1 et ses paramètres Arg1 et Arg2, cela nous donne :
-Command "& C:\Scripts\MonScript.ps1 -Arg1 'IT-Connect' -Arg2 'X.X.X.X'"
Ce qui nous donne la ligne complète suivante :
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command "& C:\Scripts\MonScript.ps1 -Arg1 'IT-Connect' -Arg2 'X.X.X.X'"
Note : si vous indiquez la ligne ci-dessus directement dans la création de la tâche, il vous sera proposé de séparer automatiquement l'argument de l'appel du programme, il vous suffit d'accepter.
Voilà, l'exécution de scripts PowerShell depuis le planificateur de tâche n'a plus de secret pour vous ! En cas de problème, vérifiez bien le positionnement de vos guillemets, et jetez un oeil à l'historique d'exécution de votre tâche planifiée pour le debug.
Pour vous lancer dans la rédaction d'un script PowerShell, suivez notre article : Débuter avec PowerShell
Pas besoin d’aller dans system32 etc, simplement « powershell.exe » devrait fonctionner sans soucis.
Oui, mais s’appuyer sur le « path » présente un « risque » et ça ne coute pas grand chose de stipuler les chemins explicites dans une tache planifiée 🙂
Attention toutefois aux stratégies d’exécution. Ici le script est local (c:\Scripts) et ne devrait pas poser de souci (le réglage de get-executionPolicy par défaut est normalement positionné sur « RemoteSigned »). Si le script est stocké sur le réseau (le partage d’un DC par exemple), la tache échouera. Donc par sécurité, je conseille d’ajouter aussi l’argument « -ExecutionPolicy bypass », qui évite les mauvaises surprises 😀
Bonne continuation