# Programmation PowerShell/Version imprimable

* Si vous imprimez cette page, choisissez « Aperçu avant impression » dans votre navigateur, ou cliquez sur le lien Version imprimable dans la boîte à outils, vous verrez cette page sans ce message, ni éléments de navigation sur la gauche ou en haut.
* Cliquez sur Rafraîchir cette page pour obtenir la dernière version du wikilivre.
* Pour plus d'informations sur les version imprimables, y compris la manière d'obtenir une version PDF, vous pouvez lire l'article Versions imprimables.
Une version à jour et éditable de ce livre est disponible sur Wikilivres, une bibliothèque de livres pédagogiques, à l'URL : https://fr.wikibooks.org/wiki/Programmation_PowerShell

# Introduction

Pour commencer, PowerShell est un langage de script et un shell permettant de traiter des commandes.
PowerShell (ci-après PS) a la particularité d'être un shell objet. Quand vous utilisez un terminal classique tel que cmd.exe ou bash, vous exécutez des commandes et du texte est renvoyé. PS utilise des technologies modernes et renvoie des objets qui seront affichés sous forme de texte.
Vous vous demandez certainement en quoi cela peut vous être utile d'apprendre ce langage, dans la mesure où vous pouvez potentiellement très bien vous en passer. PowerShell est destiné à ceux qui veulent aller plus loin dans l'administration et l'automatisation de leur ordinateur, qu'il s'agisse d'une machine cliente ou d'un serveur.
Tout le monde s'y est mis, il existe des modules (des extensions) qui vous permettront d'utiliser le PS avec de nombreuses technologies telles que les serveurs LDAP, les serveurs de messagerie, etc.
Dans cette première partie, vous pourrez trouver une petite histoire de PowerShell ainsi que quelques explications vous permettant d'appréhender les chapitres qui suivent. Il sera aussi décrit les pré-requis nécessaires pour utiliser PowerShell sur un ordinateur.

## Rapide histoire de la technologie PowerShell

PowerShell est basé sur le framework .NET (dot net Windows). Son histoire est donc liée à ce framework dont la première version commerciale est sortie en 2002. Windows PowerShell a été pensé et créé par plusieurs ingénieurs dont M. Jeffrey Snover qui en est l'inventeur selon Wikipedia. Après avoir travaillé pour d'autres grands acteurs de la branche, M. Snover a rejoint Microsoft en 1999. Dès 2003 déjà, il travaille sur un shell objet. En 2006, la version 1.0 de PowerShell est distribuée officiellement. Avec l'arrivée de Windows 7 en 2009, PowerShell est le shell par défaut de Windows et cmd.exe a été laissé pour des raisons de compatibilité. Initialement prévu pour l'administration système, PowerShell est régulièrement étendu et les principaux acteurs du marché fournissent des modules permettant d'automatiser les tâches sur leurs produits. En plus de l'offre commerciale, il y a beaucoup de modules libres distribués, par exemple, sur powershellgallery.
Comme PowerShell peut faire tout ce que peux faire .NET, certains développeurs l'utilise parfois aussi. Récemment, Microsoft développe un framework dotnet destiné à tous les systèmes d'exploitation incluant les mondes Linux et Mac. En 2018, PowerShell suit le mouvement en sortant PowerShell Core 6.0 (licence MIT).

## Principe de la ligne de commande et de la console

Pour interagir avec un ordinateur, nous utilisons actuellement la souris et une interface graphique (des jolies fenêtres avec effets et animations, images, etc.). Taper une commande peut paraître désuet. Pourtant, dans certains cas, la ligne de commande est plus rapide et plus précise. Utilisée dès le début de l'informatique, la ligne de commande a l'énorme avantage de permettre l'automatisation des actions. Un exemple vaut parfois mieux que des explications confuses. Testez ceci : Avec l'interface graphique, démarrez PowerShell, tapez
puis tapez la touche retour ou entrée ce qui exécutera l'action. Avec l'interface graphique, cliquez sur Démarrer, tous les programmes, bloc-notes ce qui effectuera la même action. Chaque instruction fait donc la même chose lorsque vous tapez la touche retour ou entrée que lorsque vous cliquez sur l'icône ! Toutes les instructions peuvent être enregistrées dans un bête fichier texte (avec le notepad par exemple) et vous pouvez exécuter chaque commande une à une. Cela s'appelle un script.

## De l'intérêt des scripts

Automatiser les tâches récurrentes ce qui va indirectement produire les effets suivant :
* Éviter les erreurs humaines (incohérences au niveau de l'orthographe, oublis, etc.).
* Gagner en efficacité car, une fois réalisé, le script va vous faire gagner de nombreuses heures de travail.

## Pré-requis pour se lancer dans PowerShell

Sur Linux, vous devez d'abord installer PowerShell Core selon la procédure de la documentation Microsoft. Pour Windows, tout est déjà préinstallé. Il n'y a aucun prérequis technique selon moi à part peut-être, être administrateur de l'ordinateur et encore, ce n'est pas rédhibitoire. Il vous faut surtout un but à atteindre et un intérêt pour la programmation. Osez mettre les mains dans le cambouis et le reste suivra !

# Démarrer avec PowerShell

Maintenant que vous savez d'où vient PowerShell et que vous connaissez ses principes dirigeants, je vais pouvoir rentrer dans la technique. Non, n'ayez pas peur, ça ne va pas faire mal !

## Premier lancement de PowerShell
### Windows

Il y a plusieurs possibilités, en voici une :
⊞R
* Maintenez la touche Windows (touche logo ou touche système) enfoncée !
* Toujours en maintenant la touche Windows enfoncée, tapez R !
Le raccourci Win+R affiche la boîte de dialogue Exécuter.
* Dans la boîte de dialogue Exécuter, tapez "powershell" puis frapper la touche retour ou entrée !
La fenêtre contenant la console PowerShell est apparue. Bienvenue dans un monde meilleur !

### Linux

Il y a plusieurs possibilités, en voici une qui fonctionne sur Linux Mint :
CtrlAltT
* Maintenez les touches Ctrl et Alt toutes deux enfoncées !
* Toujours en maintenant les touches enfoncées, tapez T !
Le raccourci Ctrl+Alt+T démarre le shell de l'utilisateur (chez moi gnome-terminal).
* Dans le terminal, tapez "pwsh" puis frapper la touche retour ou entrée !
L'invite de commande doit vous indiquer que vous êtes dans le PoWerSHell version Core !

## Apparence

Comme pour les autres fenêtres, vous pouvez personnaliser l'affichage en augmentant la taille du texte par exemple :
* Faites un clic droit en haut sur la barre de titre de l'application puis
* Éditez les propriétés !

## Quitter le shell

Comme pour les autres shell, la commande
fermera le shell. Utilisez-la, c'est une bonne habitude :-)

## Copier Coller

D'une façon similaire aux shells Unix et Linux, le texte est copié lorsque vous sélectionnez du texte avec la souris dans Powershell et que vous faites un clic-droit sur celui-ci. À l'inverse, le texte est collé lorsque vous faites un clic droit dans le PowerShell est qu'aucun texte n'est sélectionné !

## Les Command-Lets

Command-Lets ? Commandlettes ? Kézaco ? Aussi surnommées Cmdlets, ces commandes permettent de faire des actions dans PowerShell. Elles sont utilisées pour manipuler des objets. On peut les diviser en deux parties : [Verbe]-[Nom]. Le verbe correspond à l'action faite, le nom correspond à l'objet manipulé. Logique, non ?

## Les 3 commandes qui vous sauveront la vie

Voici trois commandes bien utiles au début de votre carrière de PowerShelliste :
* Get-Help
Get-Help affiche l'aide
affichera l'aide de la commandlette Get-Item.
En PowerShell, il y a des arguments par défaut aussi, vous pouvez omettre l'argument -Name comme suit :
* Get-Member
Get-Member affiche des informations sur un objet
Au passage, remarquez que 4 n'est pas une lettre mais un System.Int32 soit un chiffre entier. Vous pourrez le comparer à d'autres chiffres, etc. Mais reprenons ...
En PowerShell, vous pouvez très souvent ignorer la casse et donc taper :
* Format-Table
Format-Table affiche les données sous forme de tableau (en chaîne de caractères)
Ouh là ... ça devient compliqué ! Nous allons simplifier cela ! Vous pouvez chaîner les commandes en utilisant le caractère | (pipe en anglais). Ceci permet d'éviter l'utilisation de l'argument -InputObject ! Les deux commandes ci-dessus deviennent :
et
Pas besoin de maîtriser cela pour l'instant. Vous savez ce que c'est et ça suffira pour l'instant. Continuez simplement votre lecture et pratiquez !

## « Help, I need somebody... »

* Important
Ne demandez pas de l'aide tout de suite, continuez d'abord votre lecture ! Creusez !
* Lien
Il existe plusieurs forums. En voici un qui me semble bien (actif en 2018) : http://powershell-scripting.com/index.php

# Navigation

Maintenant que vous connaissez un peu mieux le principe de fonctionnement de PowerShell, abordons la navigation, ou comment s'y retrouver une fois dans la commande PowerShell. C'est bien joli de connaître les cmdlets ou de savoir le principe de la console, si on ne manipule rien et que l'on ne va nulle part. Dans ce chapitre sera traiter tout ce qui concerne les dossiers et les fichiers, que ce soit les parcourir, les créer, les modifier ou encore faire une recherche.

## Un point sur le système de fichiers de Windows

Le système de fichiers c'est la manière d'écrire les données sur le média en l’occurrence sur votre disque dur ! De mon point de vue, vous n'avez pas besoin de rentrer dans les détails mais je vous mets un lien à tout hasard : NTFS. Ce que vous devez savoir :
* vous pouvez créer une arborescence de dossiers, sous-dossiers qui contiennent des fichiers.
* vous pouvez définir des permissions (ACLs) pour restreindre les accès, etc.

## Où suis-je ? Comment puis-je naviguer ?

* Get-Location
La commandlette Get-Location vous indique le répertoire courant. Pour vous déplacer dans la hiérarchie de dossiers, sous-dossiers. utilisez la commande suivante :
* Set-Location
ce qui définira le dossier c:\users comme répertoire courant. Notez que vous n'êtes pas limité au lecteur C:\ ! Si vous avez une clef usb ou un disque dur externe, vous pouvez taper ceci par exemple :
Ouh laaa ... ça me gave de taper les chemins complet ! Là encore, PowerShell est un shell moderne et vous avez la complétion automatique à votre disposition. Procédez ainsi :
* Tapez la commande soit Set-Location puis
* Tapez le début du chemin soit c:\u
* Frappez la touche TAB (tabulation) ce qui demande l’auto-complétion.
Si le chemin n'est pas le chemin voulu, frappez au temps de fois la touche TAB que nécessaire ! Quand le chemin correct est affiché, validez en frappant la touche retour ou entrée !

## Lister

Pour afficher le contenu d'un dossier, tapez :
Notez que vous pouvez utiliser les arguments -File et -Directory pour ne lister que les fichiers ou que les dossiers :
Bien qu'un peut compliquée si vous venez de commencer, je vous donne cette commande :
Ceci permet d'avoir les derniers fichiers modifiés ce qui peut être pratique.

## Création et modification de fichiers

* New-Item
La commande New-Item permet de créer des fichiers, dossiers et d'autres éléments que vous verrez plus tard ! Créer un fichier vide n'a guère de sens. Je vous donne donc la commandlette pour créer un sous-dossier :
Remarquez que j'ai raccourci la valeur de l'argument. J'aurais pu écrire -ItemType Directory mais là aussi, PowerShell vous laisse être un peu paresseux.
* création d'un fichier avec un contenu
Utilisez le pipe comme suit pour créer un fichier avec du contenu
Vous pouvez vérifier, la valeur 1 est écrite dans le fichier exemple.txt
Faisons de même pour du texte :
Retenez que le guillemet américain simple écrase le contenu et que le guillemet américain double met le contenu à la fin (mode append).

## Lecture de fichier

Pour lire les 50 dernières lignes d'un gros fichier de logs :
Pour en filtrer les lignes contenant une chaine (équivalent au grep Linux) :

## Mais où est Charlie ?

Pour l'instant, je ne trouve pas d'exemple pour démarrer une recherche Windows Search mais en théorie, ça doit être faisable
En revanche, voici deux commandlettes utilisables de suite :
La commande ci-dessus listera les dossiers et les fichiers contenant le mot fête.
La commande ci-dessus listera les fichiers contenant le mot fête situés dans le dossier courant uniquement.
La commande ci-dessous fait de même mais en parcourant tous les sous-dossier ce qui peut prendre beaucoup de temps !
La commande ci-dessus listera les fichiers contenant le mot fête dans le dossier courant et les sous-dossiers.
Attention toutefois, si la commande met trop de temps, vous pouvez l'arrêter avec la combinaison de touches ci-dessous :
Important : en appuyant simultanément sur les touches contrôle et C, vous arrêtez l'exécution du script !

# Formatage de l'affichage

C'est en train de devenir intéressant

## Un point sur les données dans PowerShell

Retenez bien que PowerShell est un shell objet. En bref, là ou les anciens shell manipulent des chaines de caractères, PowerShell manipule des objets du framework .NET

## Formatage de l'affichage

Les objets manipulés par PowerShell ont une méthode ToString qui se charge de noter la description ou la valeur de l'objet au format de chaînes de caractères. Cette méthode est parfois appelée automatiquement par PowerShell mais vous pouvez l'appeler explicitement aussi ! Prenons 12 qui est une valeur typée entier :
En exécutant l'instruction ci-dessus, vous constatez qu'il est écrit TypeName : System.Int32
Ci-dessous, une commandlette pour afficher dans la console la valeur
Automatiquement, PowerShell fait ceci :
Les types d'objet définissent un formatage par défaut et vous pouvez le constater avec une date :
Lorsque vous en aurez besoin, sachez simplement que vous pouvez modifier cela. Voici un exemple pour la date :
La notion du type des données peut être déroutante lorsque vous débutez. Utilisez abusivement Get-Member pour identifier le type de données renvoyé par PowerShell !

## Important

Dans la mesure du possible, travaillez avec des objets et non avec des chaines de caractères !
C'est la notion principale à retenir : avec PowerShell, on agit sur des objets du framework .NET et pas uniquement sur du texte comme les anciens shells !

## Formatage de nombreuses données

Cela devient important lorsque vous traitez des listes par exemple avec
La commandlette ci-dessus renvoie une collection de zéro à beaucoup d'éléments typés System.Diagnostics.Process.
Vous pouvez l'afficher en version texte avec la commandlette suivante :
La commandlette Format-Table renvoie des données formatées ! Elles n'ont plus leur type d'origine et donc, vous ne pouvez plus travailler les objets par la suite car la date StartTime est une chaîne de caractère suite au traitement de formatage. En résumé, les commandes de formatage sont à appliquer en fin de traitement.
Vous pouvez créer vos propres colonnes, etc. Mais je vous conseille d'ignorer tout cela car le but de PowerShell est de traiter les données et non du texte, vos fonctions et vos scripts devront renvoyer des objets et non du texte.

# Les scripts
## Nouvelle étape, créez un script !

Arrivé à ce stade, vous allez franchir une nouvelle étape à savoir : créer et exécuter un script PowerShell.
Un script PowerShell n'est rien d'autre qu'un fichier texte avec l'extension .ps1 ! Vous pourriez utiliser le bloc-notes de Windows pour créer et modifier vos scripts.
Microsoft vous fournit un outil pour le développement de scripts complet aussi utilisez-le :
* PowerShell ISE
Pour les linuxiens et les utilisateurs avancés, vous pouvez utiliser un autre éditeur comme gedit, Sublime, VSCode ou autres.
Il existe plusieurs façons pour démarrer PowerShell ISE. En voici une :
* Utilisez le raccourci Win+R pour afficher la boîte de dialogue Exécuter comme décrit précédemment !
* Tapez powershell_ise et validez en frappant la touche retour ou entrée !
Vous constaterez que l'outil est bien fait. Il y a trois parties :
* la partie où vous éditez vos scripts (comme dans le bloc-notes mais avec la coloration syntaxique et l'auto-complétion)
* la partie où vous pouvez taper des commande (comme dans le shell lui-même)
* un volet latéral vous affichant les paramètres des commandes, etc.
Copiez le script ci-dessous en guise d'exemple dans la partie pour éditer les scripts :
puis enregistrez le script avec le raccourci CTRL+S ! Pour l'exemple, appelons-le coucou.ps1 !
Enfin, démarrer votre session de débogage avec F5 !
L'outil vous donne la possibilité de déboguer votre script en plaçant des points d'arrêt. Pour cela, cliquez sur la ligne concernée par exemple la première ligne puis tapez F9 !
Enfin, démarrez votre session de débogage avec F5 ! L'exécution sera mise en pause et vous pourrez reprendre avec F5 (Continue) ou passer à la prochaine ligne avec F10 (Step Over). F11 fait de même mais en s'arrêtant à l'intérieur des fonctions appelées par le code (Step Into) ! Maj+F11 revient dans le code principal (Step Out). Testez un peu est sachez que tout cela est disponible pour vous aider lorsque vous serez plus avancé.
Il est possible de voir la pile des appels avec CTRL+SHIFT+D et vous pouvez voir le contenu des variables en positionnant le pointeur de la souris sur la variable.
Quand vous estimez que le script est OK, enregistrez et fermez !

## Nouvelle étape, utilisez un script

Ouvrez le shell et tapez simplement le nom du script :
Voilà, vous avez la base ! Sachez que vous pouvez définir des paramètres pour influencer l'exécution du script ! Lorsque le code devient plus complexe, vous pouvez le découper en plusieurs fonctions ! Vous pouvez créer vos commandlettes personnelles et les enregistrer dans vos modules personnels, les transmettre à vos collègues !

# Variables, constantes et alias
## Les variables

En PowerShell, une variable est précédée par un dollar par exemple :
La variable age contient un chiffre entier : 18.
Il existe des notions de type de données, de portées des variables, de constantes en lecture seule, etc.
Pour l'instant, écrivez simplement vos variables juste avant de les utiliser ou au moment de les utiliser.
Ignorez le typage car PowerShell fournit un typage dynamique des données !
Ignorer les constantes !

## Les alias

Au passage, je vous présente les alias ou du moins un alias :
L'alias gal se réfère à la commandlette Get-Alias !
Dans un script, n'utilisez pas les alias ! Préférez les commandes complètes car elles seront plus lisibles pour vos relectures !
Les alias sont très pratiques lorsque vous utilisez le shell en tapant les commandes pour effectuer une tâche. Ils vous feront gagner du temps. Remarquez que les alias sont mentionnés par la commandlette Get-Help
vous dit qu'il y a trois alias : gci, ls ou dir ! Tous les trois sont parfaitement équivalents.

# Tableaux
## Les tableaux

Avoir une variable pour une donnée, c'est bien. Toutefois, vous aurez vite besoin d'une variable pour une collection de données.
En PowerShell, ceci est une variable qui référence un tableau de 3 entiers :
et vous accédez à chaque élément comme ceci :
De nombreuses commandlettes vous renverrons des tableaux, des collections qui vous pourrez parcourir !
Vous pouvez créer vos collections personnelles ainsi :
Et vous pouvez ajouter des éléments par la suite :
Ci-dessus, j'ajoute un entier dans une collection.
Lorsque vous verrez les boucles, vous verrez comment utiliser vos tableaux, collections, etc.

# Redirections
## Redirections

En PowerShell, les commandlettes exécutées affichent parfois des informations dans la console lors de l'exécution et il peut être utile de rediriger les sorties pour masquer ces messages.
C'est assez complexe aussi je ne vous donnerai que cette commande pour débuter :
* Out-Null
Out-Null envoie le texte d'une commandlette dans le néant !
Normalement, l'utilisation typique d'une redirection se fait dans le shell. Ce peut être l'enregistrement des erreurs dans un fichier séparé par exemple :
* 2>&1
2>&1 redirige le flux 2 (les erreurs) dans le flux 1 (les messages s'affichant en cas de succès)
Peut-être en aurez-vous besoin un jour ? En attendant, poursuivez car vous n'avez pas besoin de maîtriser ceci au début !

# Conditions
## Les conditions

Pour donner vie à vos scripts, vous aurez besoin des conditions ou Statements en anglais.
La structure la plus simple est le SI ce qui donne ceci : si une condition est remplie, alors fais ceci sinon fais cela !
Cette structure s'appelle le IF STATEMENT. Pour utiliser cette structure, je vous conseille de procéder ainsi dans ISE :
* Tapez CTRL+J pour afficher les snippets (bouts de code prêt à l'emploi) !
* Tapez If puis ...
* Frappez la touche retour ou entrée !
Le code est inséré. C'est bien pratique :-)
Voici un exemple :

# Boucles

Utilisez aussi les snippets pour les boucles !

## While
# Switch
## Les Switch

Comme pour le reste, utilisez les snippets (CTRL+J) !

# Les objets personnalisés
## Les objets personnalisés

L'usage de PowerShell (ci-après PS) devient intéressant et réellement efficace lorsqu'on commence à créer ses propres objets. C'est la réelle plus-value d'un shell objet vs shell texte !
Retenez qu'il existe un type d'objet nommé PSCustomObject permettant de créer vos objets comme vous le voulez ! Vous allez pouvoir stocker les informations structurée selon vos besoin dans des collections (voir ou revoir la partie des tableaux).

## Créer un objet

L'exemple ci-dessous vous montre comment créer un objet correspondant à vos besoins :

## Récupérer un objet ne contenant que ce dont on a besoin

L'exemple ci-dessous vous montre comment obtenir les propriétés désirées d'un objet comportant des dizaines de propriétés :

## Ajouter un objet à une collection

L'exemple ci-dessous vous montre comment ajouter vos objets dans une collection :

## Boucler et enrichir la collection d'objets

Il est important de savoir ajouter, petit à petit des informations dans vos objets :
Il est utile de savoir ajouter des valeurs calculées dans vos objets :

## Aller plus loin avec les objets

Il est possible d'ajouter des méthodes à vos objets, etc.

# Fonctions
## Les fonctions

Les fonctions permettent de coder plus proprement (clean code). Quand vous sentez que vous vous répétez, alors créez une fonction !
En PowerShell, fonctions et commandlettes ne sont pas équivalentes.
* la fonction est destinée à être utilisée dans le même code c'est à dire dans votre script directement.
* une commandlettes est destinées à être utilisée par des tiers ou par d'autres scripts !
Comme pour les autres structures, utilisez les snippets pour créer facilement votre fonction ! Vous verrez qu'une commandlette peut contenir plusieurs fonctions en interne si nécessaire.

# Services
## Les services et les processus

Les services sont des programmes sans interface qui fonctionnent en permanence en tâche de fonds. Par exemple :
* WinRM est le service qui attend les connexions à distance en PowerShell
* Spooler est le service qui attend les pages à imprimer
PowerShell fournit des commandes pour gérer les service comme par exemple pour redémarrer le spooler d'impression :
Les processus sont des programmes ou des bout de programmes qui s'exécutent et se terminent. Par exemple :
* notepad est le bloc-notes Windows
PowerShell vous permet de démarrer des processus (avec interface graphique ou non) comme par exemple le bloc-note :
Vous pouvez aussi trouver et arrêter un programme :
Vous pouvez donc créer vos lanceurs spécialisés composé d'un raccourci sur un script powershell qui démarre un exécutable par exemple.

# Remote
## Les accès distants
### Remarque

De nombreuses commandlettes propose l'argument -ComputerName ce qui permet de démarrer une commande sur un PC distant sans devoir ouvrir une session. Par exemple :

### Procédure

D'une façon similaire à SSH pour Unix / Linux, PowerShell peut être utilisé pour se connecter sur un autre poste de travail voir des milliers de machines d'un coup.
Bien entendu, vous devez avoir les permissions requises pour cela c'est à dire : - être Domain Admin - être Local Admin du PCs cible - ou avoir des permissions configurée par l'administrateur
Si tel est le cas, c'est très simple, vous créez une session, vous vous connectez et vous la fermez à la fin comme cela :
Vous travaillez à distance puis...
Je le note de tête alors n'hésitez pas à corriger en cas d'erreur !
Au passage, avec PowerShell Core (la version multi-système de PS), vous pouvez vous connecter sur des machines Linux :
Le PowerShell Core permet de gérer un parc composé de machine fonctionnant sous des OS différents.