.. ================================================== .. FOR YOUR INFORMATION .. -------------------------------------------------- .. -*- coding: utf-8 -*- with BOM. ================ 4-Scripts - Base ================ Un script est un ensemble de commandes permettant d'effectuer une tâche. Le fichier aura une extension **.ps1** et un double-clique provoque l'ouverture du fichier avec **notepad**. Si l'on veut exécuter le script, il faut le faire depuis ISE, une boite de commande ou le planificateur de tâches. Dans certains cas, les droits administrateurs sont requis. Par défaut, la stratégie de sécurité de Microsoft bloque l'exécution des scripts (**Restricted**). On active l'exécution des scripts sur une machine avec la commande **Set-ExecutionPolicy** et il est nécessaire d'avoir les droits administrateur. La stragégie **Unrestricted** s'applique dans notre cas, car nous sommes dans une école. Ce ne serait pas prudent dans une entreprise. Les zones d'un script sont : l'en-tête, la zone pour les paramètres et les variables, les fonctions et enfin le corps du script. .. image:: Capt-zones-script.PNG :En-tête: Pour les commentaires, on utilise le **#**, pour une seule ligne et <#...#> pour plusieurs lignes :: # commentaire Write-Host "HELLO" Pour plusieurs lignes :: <# commentaires commentaires commentaires #> Dans le canevas fourni dans la première page du cours, l'en-tête du fichier est composée de plusieurs parties. L'aide utilise ces différentes parties : **.NOTES**, **.SYNOPSIS**, **.DESCRIPTION**,... .. image:: Capt-aff-help.PNG Chaque partie correspond à une rubrique de l'aide. Il est impératif de respecter le point et les majuscules. Pour la totalité des possibilités pour l'aide, voir sur le site de Microsoft : `Powershell help `_ La partie du code qui affiche l'aide fait appel à la variable **$MyInvocation** qui donne des indications sur le script Lorsque l'aide s'affiche, le résultat donne .. image:: Capt-aff-help-console.PNG Les parties NOTES, .SYNOPSIS, .DESCRIPTION et .EXEMPLE sont toujours présentes et les autres sont ajoutées si besoin. Possible seulement 1 fois : .NOTES, .SYNOPSIS, .DESCRIPTION, .OUTPUTS Possible plusieurs fois : .PARAMETER, .EXEMPLE, .LINK * .NOTES : informations sur l'auteur, date * .SYNOPSIS : max 1 ligne, comme un titre * .DESCRIPTION : explications complètes sur ce que fait le script, ce qui se passe en cas d'erreur, le résultat attendu * .PARAMETER : le nom du paramètre, ce qu'il fait, son type, les contraintes,... et un seul à la fois * .OUTPUTS : ce qui est généré, fichier d'erreurs, création d'utilisateur(s), modification d'une clé,... * .EXEMPLE . ligne pour lancer le script et aussi un seul à la fois et bien si min 2 exemples * .LINK : lien sur un site ou prérequis comme nom d'un ou plusieurs script(s) (par exemple : utilisation de 2 scripts Create-User et Create-Group dans un Add-UserGroup) A noter que .INTPUTS existe et que cela défini ce qui peut provenir du pipe. :Normes de codage: On respecte les normes de codage définies dans l'école. Pour le nom des scripts, on utilise **Firstname-Verb-Noun**, avec des majuscules pour la première lettre du verbe et du nom. On ajoute le prénom devant le nom du script, pour que l'enseignant puisse différencier les scripts lors de contrôles!!! Pour les noms des paramètres (après "param") et des fonctions dans le script, on utilise UpperCamelCase Pour les variables, on utilise lowerCamelCase. La notion de **guard clauses** permet l'optimisation du code en évitant de le parcourir entièrement en cas d'informations fausses ou manquantes Il faut éviter d'utiliser la partie *else* et plutôt ajouter un *exit* dans la partie *if* 2 exemples sont le test des paramètres du script et les droits administrateur `Guard clauses `_ :Les paramètres: Dans le script, la première ligne de code doit être **param** Dans le cas d'un script, les paramètres non explicitement sélectionnés seront pris dans l'ordre, mais dans le cas d'une cmdlet, il ne tient compte que du premier de la liste. .. image:: Capt-param-defaut-cmdlet.PNG :Scripts: Si le script est exécuté avec les paramètres. .. image:: Capt-Give-Name-et-result.PNG Les paramètres d'un script que l'on a codé auront le même comportement, à savoir que lorsque l'on tape le **-** la liste des paramètres s'affiche dans un menu déroulant. .. image:: Capt-script-menu-param.PNG Dans l'aide, la liste des paramètres sera définie par **.PARAMETER**. .. image:: Capt-script-param-description.PNG Concernant le menu des paramètres, il est établi lorsque l'on définit les variables du script. .. image:: Capt-script-param-var.PNG Le corps du script se situe après la définition des paramètres et du test de la présence du(es) paramètre(s) .. image:: Capt-script-body.PNG :Attributs de paramètres: On peut donner des caractéristiques particulières à un paramètre, dans le même esprit que pour typer une variable! :: param([Parameter(Mandatory=$True, Position=0, ValueFromPipeline=$True)] [string]$RequiredParam, $NotRequiredParam) Concernant le paramètre **$RequiredParam**, **Mandatory** définit qu'il est obligatoire, **Position** qu'il doit être en première position et **ValueFromPipeline** que les données peuvent provenir d'un pipe. :Les arguments: Les arguments seront mis "de manière libre" après le nom du scipt Dans la liste des variables automatiques, il y a **$Args** et c'est un tableau des arguments passés lors de l'exécution d'un script Ce tableau peut contenir plusieurs sortes d'éléments et sa longueur s'obtient avec **$Args.length** Un script qui ne contient que **$args**, affichera le contenu du tableau des arguments fournis lors du lancement du script .. image:: Capt-args-et-result.PNG :Debug: Dans ISE, il y a un menu Déboguer Dans ISE et dans VS Code, les raccourcis sont : F5 : exécuter F9 : ajouter un point de debug F10 : pas à pas (step over) F11 : pas à pas détaillé (step into) On peut voir le contenu d'une variable en passant dessus lentement avec le curseur. Avec VS Code, il faut ajouter un fichier texte et le sauvegarder en choisissant le type *Powershell* :Exercices: * :download:`Exo Scripts Base <../Exercices/E-122-4-ScriptsBase.pdf>`