Blog ENI : Toute la veille numérique !
🎁 Jusqu'au 31/12, recevez notre
offre d'abonnement à la Bibliothèque Numérique. Cliquez ici
🎁 Jusqu'au 31/12, recevez notre
offre d'abonnement à la Bibliothèque Numérique. Cliquez ici

Quelques bonnes pratiques

Toujours vérifier l’aide proposée par PowerShell

Comprendre le fonctionnement d’une cmdlet ou une fonction spécifique peut parfois être complexe, surtout si de nombreux paramètres existent et que certains sont obligatoires.

Il existe pour cela une méthode très efficace permettant d’obtenir des informations sur le fonctionnement et l’utilisation des paramètres. Celle-ci est Get-Help, qui, comme son nom l’indique, permet d’obtenir de l’aide sur une cmdlet, une fonction… Le prérequis est bien entendu que l’aide soit documentée, sinon aucune information n’apparaît.

La cmdlet Get-Help permet par exemple de récupérer :

  • la liste des paramètres disponibles,

  • le fonctionnement de ces paramètres,

  • des exemples d’utilisation de la commande.

Nous ne détaillerons pas dans ce chapitre cette cmdlet, car le chapitre L’aide PowerShell, un précieux allié traite déjà le sujet.

Get-Member : comprendre ce que contient un objet

1. Fonctionnement

Nous avons vu précédemment que pour obtenir des informations sur une cmdlet il fallait utiliser la cmdlet Get-Help.

Utilisons donc cette cmdlet pour comprendre le fonctionnement de la cmdlet Get-Member :

get-help get-member 

Ci-dessous le retour :

PS C:\Users\damien.vanrobaeys> get-help get-member 
NAME 
    Get-Member 
 
SYNOPSIS 
    Gets the properties and methods of objects. 
 
SYNTAX 
    Get-Member [[-Name] <System.String[]>] [-Force] [-InputObject 
<System.Management.Automation.PSObject>] [-MemberType  
{AliasProperty | CodeProperty | Property | NoteProperty | 
    ScriptProperty | Properties | PropertySet | Method |  
CodeMethod | ScriptMethod | Methods | ParameterizedProperty |  
MemberSet | Event | Dynamic | All}] [-Static] [-View {Extended | 
    Adapted | Base | All}] [<CommonParameters>] 
 
DESCRIPTION 
    The `Get-Member` cmdlet gets the members, the properties and 
methods, of objects. 
    To specify the object, use the InputObject parameter or pipe 
an object to `Get-Member`. To get information about static members, 
the members of the class, not of the instance, use the 
    Static...

Get-Command pour trouver la bonne commande

PowerShell contient de nombreuses cmdlets par défaut.

Lorsque vous souhaitez effectuer une action, il est important de trouver la cmdlet qui peut être utile en saisissant, par exemple, un mot-clé. La cmdlet à utiliser sera Get-Command.

Dans l’exemple suivant, nous souhaitons savoir comment gérer la partie WMI avec PowerShell. Notre mot est WMI, tel que ci-dessous :

Get-Command "*wmi*" 

Ci-dessous le résultat :

images/05RI01.png

Nous obtenons différents éléments (alias, cmdlets, applications, fonctions).

Pour n’afficher que les cmdlets, nous utiliserons :

Get-Command "*wmi*" -CommandType cmdlet 

Nous souhaitons maintenant lister les commandes nous permettant de gérer les CSV :

Get-Command "*csv*" -CommandType cmdlet 
images/05RI02.png

Lors de l’installation d’un module tiers, d’autres cmdlets sont également ajoutées.

Pour bien utiliser un module, il faut au préalable lister les cmdlets contenues dans ce module. Pour cela, il suffit d’ajouter le paramètre -Module suivi du nom du module concerné.

Nous allons lister les commandes contenues dans le module PnP.PowerShell (qui permet de gérer SharePoint) :

get-command -module PnP.PowerShell 

Ci-dessous le résultat :

images/05RI03.png

Commenter son code

1. Que signifie commenter son code ?

Commenter son code signifie fournir des informations sur ce que fait le script ou telle commande. Cela se traduit par un ajout de texte au-dessus ou à côté d’une ligne de code. Certains préfèrent également ajouter un bloc de commentaire au début du script pour indiquer ce qu’il fait et comment l’utiliser.

Une des règles primordiales lorsque vous réalisez un script PowerShell est de penser aux choses suivantes :

  • Quelqu’un doit-il réutiliser ce code ?

  • Sera-t-il possible de le relire, de le modifier facilement après plusieurs mois ?

Il est donc important de commenter votre code afin de donner le maximum d’indications sur :

  • la date d’écriture du script avec éventuellement une version et qui l’a réalisé ou mis à jour,

  • ce que fait le script,

  • ce que fait chaque ligne ou les différentes étapes.

2. Pourquoi est-ce important ?

Prenons les exemples suivants :

  • Vous cherchez un script sur Internet pour une action précise.

  • Vous devez modifier un script réalisé par un collègue qui ne travaille plus avec vous.

À première vue, le script paraît long et complexe. Cependant, si celui-ci est commenté, il sera relativement plus simple de se l’approprier et comprendre son fonctionnement....

Indenter son code

1. Qu’est-ce que l’indentation ?

L’indentation correspond au fait d’utiliser la tabulation entre les éléments d’un script. Il s’agit simplement de l’utilisation de la touche [Tab].

images/05RI04.png

L’indentation, ou l’utilisation de la touche [Tab], se fait sur une ligne ou un bloc de lignes et a pour effet de décaler cette ligne ou bloc d’un cran vers la droite.

2. Indentation en exemple

Prenons par exemple la commande suivante ouverte dans Notepad++ :

images/05RI05.png

Ici, aucune indentation n’est appliquée, aucune tabulation.

L’utilisation de la tabulation sur cette ligne aura donc pour effet de décaler la ligne vers la droite :

images/05RI06.png

3. Pourquoi indenter le code ?

L’indentation de votre code permet de le rendre clair et lisible pour vous et pour les autres. Au même titre que le fait de commenter, l’indentation permet de comprendre facilement un script.

Lorsque nous créons un script, il faut penser plus loin, c’est-à-dire à la personne qui devra se charger de le maintenir, de le modifier… Écrire un script en un seul bloc, sur la même ligne, sans indentation, peut être clair aux yeux de celui qui l’écrit mais sera la plupart du temps difficilement lisible pour un œil extérieur. En ce qui nous concerne, la première chose que nous faisons lorsque nous ouvrons un script d’un collègue ou trouvé sur Internet est de l’indenter, si cela n’est pas fait.

4. Règles d’indentation

Chaque personne a sa manière de coder, il n’y a pas réellement de bonnes ou mauvaises façons...

Utiliser la saisie semi-automatique ou l’autocomplétion

1. Pourquoi ?

Écrire des scripts ou commandes peut parfois paraître fastidieux lorsque nous ne connaissons pas très bien les cmdlets à utiliser ou que nous tapons vite sur le clavier sans vérifier. Cela peut avoir pour effet d’entraîner des erreurs de saisie et donc d’exécution du script ou code. Cela peut également nous faire perdre du temps pour comprendre d’où vient le problème.

C’est pour cela que la saisie semi-automatique des commandes ou l’autocomplétion peut être un véritable atout.

2. Fonctionnement

Le principe est très simple, lorsque nous saisissons le début d’une cmdlet, PowerShell va nous aider à trouver la bonne en affichant les différentes possibilités. Cela fonctionne pour les cmdlets, mais également pour les paramètres des cmdlets. Cela nous permettra donc pour une cmdlet de chercher un paramètre précis.

3. Comment l’utiliser ?

Son utilisation se fait très facilement en utilisant la touche [Tab].

images/05RI04.png

Cela aura pour effet d’afficher la cmdlet qui se rapproche le plus de votre saisie. Si cela ne correspond pas à vos attentes, il suffira d’utiliser à nouveau la touche [Tab] jusqu’à trouver la cmdlet souhaitée.

Dans l’exemple suivant...

Majuscules ou minuscules ?

PowerShell n’est pas un langage sensible à la casse, c’est-à-dire que les majuscules et minuscules n’ont pas d’importance.

Toutefois, quelques bonnes pratiques en termes d’utilisation de casse existent. En général, PowerShell utilise la convention de dénomination nommée PascalCase. 

Qu’est-ce qu’une convention de dénomination ?

En informatique, une convention de dénomination permet de spécifier la casse utilisée dans un type de langage.

Différentes conventions de dénomination existent :

  • lowercase : tout en minuscules, pas de séparation.

  • UPPERCASE : tout en majuscules, pas de séparation.

  • PascalCase : mettre en majuscule la première lettre de chaque mot.

  • camelCase : mettre en majuscule la première lettre de chaque mot, à l’exception du premier.

Pour démontrer comment celles-ci fonctionnent, nous allons utiliser comme exemple une variable avec deux mots, $mavariable :

  • lowercase : $mavariable

  • UPPERCASE : $MAVARIABLE

  • PascalCase : $MaVariable

  • camelCase : $maVariable

Nous avons pris ici l’exemple d’une variable, mais il en va de même pour les commandes (cmdlets).

Par exemple :...

Ne pas utiliser d’alias

1. Qu’est-ce qu’un alias ?

PowerShell offre la possibilité d’utiliser (et même de créer) des alias.

Les alias sont ce que l’on peut appeler des raccourcis de commandes, des versions abrégées. Ils sont généralement utilisés pour coder plus vite et pour réduire le nombre de caractères et lignes d’un script.

Voici quelques exemples d’alias, avec la cmdlet d’origine puis l’alias correspondant entre parenthèses :

Get-Item (gi), Get-ChildItem (gci), Get-WMIObject (gwmi), Get-Content (gc), New-Item (ni), Remove-Item (del), Add-Content (ac), Get-Command (gcm), Get-Module (gcmo), Copy-Item (cp, cpi, copy), Get-Process (gps).

Nous reviendrons plus en détail sur les alias dans le chapitre PowerShell, un langage de cmdlets.

Cependant, même si PowerShell permet l’utilisation d’alias, cela ne signifie pas que c’est recommandé.

Au contraire, une des bonnes pratiques est de ne pas utiliser d’alias dans son script.

2. Pourquoi ne pas utiliser d’alias ?

La raison est simple : il faut penser à celui qui doit relire le code. En effet, les alias sont quelque chose de connu, mais tout le monde ne connaît pas tous les alias par cœur.

Une cmdlet se présente sous la forme d’un verbe et d’un nom (verb + noun). Même si vous ne connaissez...

Favoriser la simplicité à la complexité

Un script complexe ne signifie pas pour autant que l’on est bon ou meilleur que les autres. Il faut, comme pour le reste, penser à ceux qui doivent reprendre le travail derrière.

Il nous arrive régulièrement de tomber sur des scripts incompréhensibles à première vue et pour lesquels il faut s’y remettre à plusieurs fois pour les comprendre, quelque fois même y passer quelques jours.

Même si ceux-ci ne sont pas spécialement compliqués, c’est la manière utilisée pour coder qui peut les rendre extrêmement difficiles à comprendre.

Limiter la longueur des lignes

Une des bonnes pratiques voudrait que l’on limite la longueur d’une ligne à 115 caractères (quand cela est possible, bien entendu). Limiter la longueur des lignes nous permet d’augmenter la lisibilité du script et donc d’éviter de scroller vers la droite pour voir le reste de la ou des lignes. La console PowerShell contient par défaut 120 caractères mais ne permet que 119 caractères en sortie. Sur GitHub, le nombre maximum de caractères oscille entre 121 et 126 en fonction de votre système d’exploitation, navigateur, police d’écriture… La limite des 115 caractères recommandée pour PowerShell permet généralement d’avoir une ligne complète également sur GitHub.

Éviter les points-virgules à la fin de vos lignes

1. À quoi sert le caractère point-virgule ?

Avec PowerShell, il est possible de mettre plusieurs commandes sur la même ligne. Cela permet par exemple de les rassembler et de limiter le nombre de lignes d’un script.

Dans l’exemple suivant, nous affichons la date actuelle puis deux chaînes de caractères. Chaque commande est séparée par un point-virgule.

Ci-dessous le code utilisé :

get-date; write-host "je suis la première ligne"; write-host 
"je suis la seconde ligne" 

Ci-dessous le résultat obtenu depuis la console PowerShell :

images/05RI07.png

2. Pourquoi éviter d’utiliser le point-virgule ?

Pour favoriser la lisibilité de votre code, il est préférable de mettre chaque commande à la ligne.

get-date 
write-host "je suis la première ligne" 
write-host "je suis la seconde ligne" 

Cela peut sembler futile, mais si vous avez plusieurs commandes complexes avec des boucles et conditions et que chacune est séparée par un point-virgule, le tout présenté sur la même ligne, votre code sera illisible.

Des espaces entre paramètres et opérateurs

Il est recommandé de mettre des espaces dans vos lignes entre les opérateurs et les paramètres tels que $toto = $true.

Il faut par exemple écrire :

$toto = $true 

Au lieu de :

$toto=$true 

Ou encore écrire :

$MonFicher = Get-Content "Chemin du fichier" 

Au lieu de :

$MonFicher=Get-Content"Chemin du fichier" 

Relire son code

Cela peut paraître évident, mais avant de fournir un script ou de le mettre en production, n’oubliez pas de le relire et de le retester. Parfois, on met à jour son code sans le vérifier, en pensant que la modification est mineure, mais une erreur peut vite s’y glisser, comme oublier une accolade ou une parenthèse fermante.

PSScriptAnalyzer : un moyen d’analyser son code

1. Qu’est-ce que le module PSScriptAnalyzer ?

Une bonne manière de vérifier si votre script ou code respecte certaines règles ou bonnes pratiques est d’utiliser le module nommé PSScriptAnalyzer.

PSScriptAnalyzer est un module qui permet de vérifier si votre script ou code respecte certaines règles définies.

Il permet aussi de vérifier le formatage, les indentations de votre code.

2. Comment l’installer ?

Ce module peut s’installer facilement depuis la PowerShell Gallery.

Pour installer le module, utilisez la commande suivante :

Install-Module -Name PSScriptAnalyzer 

3. Les règles que le module va vérifier

Il est possible de lister les différentes règles que le module va vérifier en analysant un script via la commande suivante :

Get-ScriptAnalyzerRule 

Ci-dessous un aperçu :

images/05RI08.png

Les règles sont classées en différentes catégories de sévérité :

  • Warning

  • Error

  • Information

L’ajout d’un Out-Gridview à la commande permet d’y voir plus clair.

images/05RI06B.png

Nous allons afficher maintenant uniquement les règles avec la sévérité Warning :

Get-ScriptAnalyzerRule -Severity Warning | select RuleName 

Ci-dessous les différentes règles trouvées :

CommonName 
---------- 
Align assignment statement 
Avoid Using Cmdlet Aliases or omitting the 'Get-' prefix. 
Changing automtic variables might have undesired side effects 
Switch Parameters Should Not Default To True 
Avoid Default Value For Mandatory Parameter 
Avoid Using Empty Catch Block 
Avoid global aliases. 
Avoid global functiosn and aliases 
No Global Variables 
Avoid Invoking Empty Members 
Avoid long lines 
Avoid using null or empty HelpMessage parameter attribute. 
Avoid overwriting built in cmdlets 
Reserved Cmdlet Chars 
Reserved Parameters 
Avoid Using ShouldContinue Without Boolean Force Parameter 
Avoid Using Deprecated Manifest Fields 
Avoid Using Invoke-Expression 
Avoid Using Plain Text For Password Parameter 
Avoid Using Get-WMIObject, Remove-WMIObject, Invoke-WmiMethod,  
Register-WmiEvent, Set-WmiInstance 
Avoid Using Write-Host 
Use compatible commands ...