[PowerShell] Découverte et personnalisation de PowerShell ISE

Bonjour à tous,

Apparu depuis maintenant quelques années, PowerShell est aujourd'hui incontournable. Pour ceux qui le découvrent, c'est un environnement d'exécution de tâches conçu spécialement pour l'administration des systèmes. Il repose entièrement sur .NET Framework et reprend les fondamentaux de la programmation orientée objet. Il permet aux administrateurs de contrôler et d'automatiser l'administration des systèmes d'exploitation Windows mais aussi de nombreux autres produits comme VMware, SCCM, Exchange, Azure, etc... Bref vous l'aurez compris, il vous sera de plus en plus compliqué de gérer vos environnements tout en ignorant ce composant !

Vous pouvez aborder PowerShell de 2 manières différentes :

  • En lançant la console PowerShell puis en exécutant des commandes comme par exemple dresser la liste de tous les processus actuellement en cours d'exécution (get-process). Après avoir récupéré cette liste vous pouvez stopper certains de ces processus à l'aide de la cmdlet Stop-Process. Dans ce mode de fonctionnement les commandes s'exécutent à votre grés. Aucune préparation n'est nécessaire. On travaille ici à la volée et le travail n'est pas réutilisable
  • En créant un script PowerShell qui prendra en charge l'exécution de nombreuses commandes que vous aurez reliées entre-elles à l'aide d'outils d'algorithmique tels que des conditions, des boucles, des filtres, etc. Ce scénario est particulièrement adapté lorsque vous devez exécuter la même procédure à de nombreuses reprises. L'idée est de décrire la marche à suivre dans ce script puis d'exécuter ce script chaque fois que ce "processus" doit être exécuté.

La rédaction d'un script PowerShell peut être réalisée avec un outil aussi simple que Notepad.exe. Cependant vous conviendrez que ce n'est pas l'outil le plus efficace car il ne permet par exemple pas de débugger ce script ou de bénéficier de coloration syntaxique bienvenue dans tout environnement de développement.

Dès la sortie de PowerShell Microsoft a intégré à Windows un éditeur de script : PowerShell ISE (Integrated Scripting Environment). Cet environnement vous permet de rédiger des scripts PowerShell tout en bénéficiant de nombreuses fonctionnalités :

  • IntelliSense qui vous proposera de compléter automatiquement ce que vous avez commencé à saisir
  • Des snippets ou extraits de code que vous pouvez insérer rapidement et ainsi réduire vos erreurs de saisie
  • Un enregistrement automatique de vos scripts toutes les 2 minutes (et croyez-moi c'est très utile !!)
  • Un debugger vous permettant d'exécuter tout ou partie de vos script en appliquant des points d'arrêt

Dans un premier temps cet environnement vous sera suffisant. Mais PowerShell ISE est un outil particulièrement personnalisable. C'est d'ailleurs son grand point fort. A tel point que plusieurs développeurs se sont "amusés" à ajouter des fonctionnalités supplémentaires qui peuvent être très utiles.

Cet article a pour objectifs de vous donner un aperçu de la personnalisation de l'éditeur PowerShell :

  • Dans un premier temps nous verrons qu'ISE est avant tout un environnement que nous chargeons qui est tout à fait personnalisable
  • Dans un second temps, nous nous focaliserons sur la création de nos propres snippets
  • Enfin je vous présenterai un Add-on permettant de littéralement doper votre ISE :  ISESteroids

 

Introduction à PowerShell ISE

PowerShell est avant tout un environnement d’exécution, ce qui veut dire que les Cmdlets PowerShell ne peuvent être exécutées que dans une invite PowerShell. Lorsque vous lancez PowerShell.exe vous lancez cet environnement ce qui implique de :

  • Charger les Cmdlets de base afin de vous permettre de les utiliser
  • Créer des variables de base
  • De sécuriser l’environnement d’exécution en appliquant plus ou moins de restriction
  • Mettre en forme l’environnement d’exécution (taille des polices de caractères, transparence, taille de la fenêtre, etc.

C’est suite à cette série d’opérations que vous serez en mesure de saisir des commandes, exécuter des script, bref réaliser des opérations.

On peut le voir dans les exemples suivants :

Lorsque vous chargez PowerShell ISE, vous chargez cet environnement d’exécution mais également un environnement d’édition de script. Vous retrouvez d’ailleurs ces deux éléments dans la composition graphique de l’outil : en haut en retrouve un Notepad amélioré et en bas l’environnement (Shell) dans lequel le script rédigé en haut sera exécuté.

005

En plaçant votre curseur dans la zone bleue, vous pouvez tapez des commandes qui seront directement exécutées. Vous constaterez par exemple que la commande Get-Variable retournera le même résultat que lorsque vous l’avez tapé dans une invite PowerShell.

En saisissant des commandes dans la partie blanche, vous éditez un script. Rien de ne produira tant que vous n’aurez pas lancé son exécution. Par contre, dès que vous démarrerez votre script, l’exécution et le résultat seront réalisés dans la partie Shell (zone bleue).

Au fur et à mesure de votre progression dans le merveilleux monde de PowerShell, vous allez développer ou télécharger des modules et scripts et vous devrez les importer dans PowerShell ISE avant de pouvoir les utiliser … et cette opération devra être réalisée à chaque fois que vous lancerez PowerShell ISE. On est tous d’accord pour dire que cette situation va vite devenir impossible !

Et c’est à ce moment qu’intervient la notion de Profils PowerShell ISE.

2. Création et gestion de profils PowerShell ISE

Un profil est un script PowerShell qui s’exécute automatiquement lorsque vous démarrez une nouvelle session ISE. Vous pouvez créer un ou plusieurs profils et les utiliser pour personnaliser l’environnement. Vous pouvez par exemple déclarer des variables, importer des modules, configurer des alias, ou modifier des préférences d’exécution.

Mais notez avant tout qu’un profil est un script. Or par défaut, PowerShell est configuré pour interdire l’exécution de scripts. Par conséquent, avant de pouvoir créer et utiliser un profil, vous allez devoir modifier la stratégie d’exécution des script PowerShell sur votre poste de travail. Pour cela, rien de plus simple, ouvrez une invite PowerShell en tant qu’administrateur puis tapez la commande suivante :

Set-ExecutionPolicy RemoteSigned -Force

Vous pouvez obtenir davantage d’information concernant les stratégies d’exécution des scripts en suivant le lien suivant : https://technet.microsoft.com/fr-fr/library/hh847748.aspx

Où les profils doivent-ils stockés ?
Réponse : ça dépend …
En réalité tout dépend de la portée de ce profil : Voulez-vous qu’il ne se charge que pour vous dans PowerShell ISE, pour tous les utilisateurs, tous les utilisateurs à chaque fois que vous démarrez ISE ou l’invite PowerShell ?Dépendamment de la réponse à cette première question, l’emplacement de stockage du profil variera :

Type de profil chemin du profil
Utilisateur courant, environnement PowerShell ISE $profile.CurrentUserCurrentHost ou $profile
Tous les utilisateurs, environnement PowerShell ISE $profile.AllUsersCurrentHost
Utilisateur courant, tous les environnements PowerShell $profile.CurrentUserAllHosts
Tous les utilisateurs, tous les environnements PowerShell $profile.AllUsersAllHosts

Vous me direz $Profile n’est pas un chemin et vous n’avez pas complètement tort. Mais pourquoi spécifier une variable plutôt qu’un chemin ?
Tout simplement parce que la valeur du chemin du profil est dynamique, elle diffère selon que vous lanciez une invite PowerShell ou ISE.

Lorsque vous lancez une invite PowerShell puis tapez $profile.CurrentUserCurrentHost, la valeur retournée sera "C:UserstotoDocumentsWindowsPowerShellMicrosoft.PowerShell_profile.ps1". En exécutant cette même commande dans ISE la valeur sera la suivante : "C:UserstotoDocumentsWindowsPowerShellMicrosoft.PowerShellISE_profile.ps1"

C’est la raison pour laquelle Microsoft a créé une variable qui s’initialise dynamiquement à chaque chargement d’environnement.

Notez que chaque commande renvoie un chemin différent.
Cette capture présente les résultat

Maintenant que nous connaissons cette information, prenons un exemple :

je souhaiterai travailler sur un script qui a pour fonction de collecter les tâches planifiées déclarées sur un poste de travail puis dans les envoyer par mail à l’administrateur

Je sais que je vais devoir travailler sur PowerShell ISE pour concevoir ce script.
De plus je risque d’y passer plusieurs jours (ceux qui me connaissent savent de quoi je parle :-).
Par conséquent, je vais créer un nouveau profil pour moi-même dans l’environnement ISE.

Pour se faire, je vais :

  • Démarrez ISE
  • Tapez la commande suivante dans la section Shell : new-item -type file -path $profile -force. Cette commande va générer un nouveau fichier à l’emplacement ciblé par la variable $profile.
  • Tapez la commande suivante dans la section Shell : psedit $profile. Cette commande va ouvrir le script dans la section Editeur. Notez qu’un nouvel onglet est apparu dans la section éditeur : Microsoft.PowerShellISE_profile.ps1
  • Ajoutez la commande suivante : Import-Module ScheduledTasks
  • Enregistrez le script puis redémarrez ISE.

Vous constaterez que toutes les commandes listées dans votre fichier de profil sont exécutées au démarrage. en tapant la commande Get-Module, vous verrez que le module ScheduledTasks est déjà chargé.
Voici la procédure imagée :

Dans l’exemple précédent nous avons décidé de personnaliser ISE pour l’utilisateur courant, mais nous aurions également pu personnaliser tous les environnements PowerShell du poste de travail en créant un script à l’emplacement référencé par la variable $profile.AllUsersAllHosts. De cette manière à chaque ouverture de PowerShell sur le PC, le module ScheduledTasks sera chargé. Vous pourrez donc lister toutes les tâches planifiées.

Cette première méthode vous permet donc de personnaliser l’environnement. Mais nous pouvons également personnaliser l’éditeur en lui-même. C’est ce que je vous propose d’aborder dans le prochain chapitre.

3. Création et gestion des Snippets

la rédaction d’un script implique de saisir souvent la même portion de code. Par exemple, à chaque fois que vous allez intégrer une condition, vous allez devoir saisir la portion de code suivante :


if()
{}
else
{}

L’éditeur ISE contient une collection de portion de codes, appelés plus communément « snippets ». Cette collection est accessible à l’aide du raccourci CRTL+J. En sélectionnant le Snippet souhaité, ISE insérera la portion de code associée.

Vous pouvez créer vos propres Snippets si vous le souhaiter. Imaginons que vous souhaitez développer vos scripts sur un même modèle. Ce modèle contient une en-tête personnalisée. Au lieu de copier-coller cette en-tête entre vos différents scripts, vous pouvez créer un Snippet et ainsi l’insérer toujours à l’aide du raccourci CRTL+J. Votre nouveau Snippet sera ajouté à la liste existante.
La commande permettant de créer un nouveau snippet est la suivante :

New-IseSnippet [-Title]  [-Description]  [-Text]  [-Author  ] [-CaretOffset  ] [-Force] [ ]

les paramètres Title, Description et Text sont obligatoires. Le champ text contient la portion de code à ajouter. Les détails de cette commande sont accessibles à l’adresse suivante : https://technet.microsoft.com/fr-fr/library/jj136881.aspx
Cette commande va créer un nouveau fichier dans le dossier $profile. A chaque chargement de ISE, tous les fichiers de snippets seront chargés et par conséquent accessibles depuis l’interface.
Voici un petit exemple concret :


Ise est configuré pour pré-charger tous les fichiers de type Snippet se situant dans $profile.

En couplant la notion de profils ISE et de Snippets vous serez en mesure de totalement personnaliser votre environnement d’édition. les possibilités sont tellement larges que quelques développeurs ses sont « amusés » à apporter tout un lot de fonctionnalités supplémentaires à cet environnement. C’est ce que nous allons voir dans la prochain chapitre.

4. Présentation de ISESteroids

Comme je le disais dans les chapitres précédents, ISE est un environnement de développement de scripts. il contient des fonctions permettant de simplifier le développement de scripts tels que la coloration syntaxique, l’intelli-sens, les snippets, la personnalisation de l’interface et un debugger.

Pour autant, certaines fonctions présentes dans des outils de développement tels que Visual Studio n’ont pas été implémentées. C’est le cas par exemple :

  • Un moniteur de variables en temps réel
  • Un navgateur de fonctions
  • Un outil de recherche en temps réel
  • des liens vers les définitions des fonctions
  • etc.

Partant de ce principe et du fait qu’ISE est entièrement personnalisable, une équipe s’est formée autour de Tobias Weltner (expert PowerShell) pour produire un Add-on à ISE : ISESteroids.
Pour information, avant de développer cet outil Tobias a rédigé de nombreux livres et articles traitant de Pwoershell. Certaines ressources sont d’ailleurs accessibles à l’adresse suivante : http://www.powertheshell.com/cookbooks/. Ces ressources sont particulièrement intéressantes du fait qu’elles ne traitent pas uniquement de la théorie de PowerShell mais également de la pratique. Elles bénéficient donc de nombreux retours d’expérience.

Ce qui est intéressant ici, c’est de comprendre que cet Add-on s’appuie sur tous les mécanismes que nous venons de décrire pour ajouter toutes ces fonctions supplémentaires 🙂

La video suivante vous donne un aperçu des possibilités offertes par cet outil :

Personnellement j’apprécie cet outil pour les fonctions suivantes :

  1. Il permet de générer des modules de manière dynamique. En règle générale, un module PowerShell est bâtit progressivement, fonction par fonction. Cet Add-on permet de déclarer un nouveau module. Lorsque vous terminez de coder une fonction il vous suffit simplement de sélectionner cette fonction et de l’ajouter au module déclaré.
  2. Il permet de retrouver très rapidement la définition d’une fonction. Lorsque vous concevez des scripts faisant appel à d’autres scripts ou modules, il arrive fréquemment qu’on ai besoin de relire le contenu d’une fonction que l’on souhaite appeler depuis notre script principal. Avec cet outil vous saisissez la fonction dans votre script principal, puis en cliquant-droit sur le nom de la fonction, vous avez la possibilité d’afficher la définition de cette fonction, même si celle-ci se situe dans un autre script non ouvert
  3. La refactorisation. Cette fonction est très utilise lorsque vous êtes plusieurs à travailler sur un script sans partager les mêmes conventions de nommage, d’indentation,etc. au final le code devient difficilement lisible. Lorsque tout le monde a terminer de coder, vous pouvez lancer la fonction de refactorisation et ISESteroids va remettre en forme le script de sorte que la même convention soit appliquée.
  4. Le versioning de fichiers. Ici pas besoin de vous faire de dessin.
  5. … et je suis sûr d’oublier les deux tiers des fonctions que j’utilise au quotidien

Enfin, dernière chose et pas de moindres : si vous être équipés de PowerShell v5 (Windows 10 et ultérieur) l’installation de ce composant est enfantine:

  • Ouvrez ISE en tant qu’administrateur
  • Placez-vous dans la section Shell puis tapez la commande suivante : Install-Module ISESteroids -Scope CurrentUser

Bref, je ne saurai que trop vous conseiller d’évaluer à minima cet outil car oui, il est payant. Mais dépendamment du travail que vous aurez à produire à l’aide de PowerShell l’investissement peut réellement être rentable. Pour le reste toutes les informations sont accessibles à l’adresse suivante : http://www.powertheshell.com/isesteroids2-2/

Enjoy 😉

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. Apprenez comment les données de vos commentaires sont utilisées.