Introduction à Microsoft Powershell
Généralités
Microsoft Powershell est une solution d’automatisation de tâches architecturé autour de 2 composants principaux :
-
1 interpréteur de commandes en ligne (→ shell)
-
1 langage de script
Bien que créé au départ uniquement pour Windows, Microsoft Powershell est devenu un outil multi-plateforme (→ Windows, Linux, macOS) utilisé pour toutes sortes de tâches, notamment dans l’administration système.
Microsoft Powershell dispose — à l’instar d’autres interpréteurs de commandes en ligne (→ ex : bash sous Linux) — des fonctionnalités suivantes :
-
historique de commandes
-
saisie semi-automatique des commandes (→ command completion)
-
alias de commandes
-
chaînage des commandes à travers de pipelines
Cependant, la façon dont est implémenté le chainage de commandes dans Microsoft Powershell le différencie nettement des autes interpréteurs dans la mesure où il repose sur l’échange d’objets plutôt que de simple chaînes de caractères.
Ces objets — disposant, comme en C++, de méthodes et de propriétés — vont simplifier considérablement le formatage ou l’extraction des données lors du chaînage de commandes.
Exemple de chaînage de 2 commandes pour récupérer, au final, la mémoire disponible :
> Get-CIMInstance Win32_OperatingSystem | Select-Object FreePhysicalMemory (1)
FreePhysicalMemory (2)
------------------
23523216
1 | chaînage des commandes Get-CIMInstance et Select-Object à l’aide du caractère ‘|’ (→ pipe). La 1ère commande récupère tout un ensemble d’informations sur la machine et la 2ème filtre/sélectionne l’information qui nous intéresse (c-à-d la mémoire disponible) |
2 | résultat du chaînage de commandes |
Versions de Powershell
2 éditions de Powershell existent :
-
Celle nommée Windows Powershell ou Powershell Desktop qui est installée par défaut sur les systèmes Windows depuis sa version 8 (→ n° de version < 6)
-
Celle nommée Microsoft Powershell ou Powershell Core qu’il faut installer séparément (→ n° de version ≥ 6)
L’édition Windows Powershell (dernière version : 5.1) est amenée à disparaître au profit de Powershell Core même si elle est encore largement utilisée en entreprise.
Powershell Core est en effet multi-plateforme et open source contrairement à Windows Powershell. C’est également sur cette édition que se concentrent les efforts de développement.
Commandes Microsoft Powershell (→ cmdlets)
L’interpréteur en ligne de commandes de Microsoft Powershell dispose d’un ensemble de commandes qu’on appelle des cmdlets (prononcer “command-lets”).
Ces cmdlets, disponibles nativement ou via des modules additionnels, peuvent être codées dans n’importe quel langage du framework .NET (→ C++, C#) ou dans le langage de script propre à Microsoft Powershell.
Voir Windows PowerShell Language Specification Version 3.0 |
Le nom des cmdlets suit une convention de nommage qui consiste en 1 verbe (anglais) suivi d'1 nom, séparés par le caractère ‘-’.
Exemples :
-
Get-Item
-
Set-Location
-
Format-Table
-
Write-Output
-
…
Microsoft Powershell n’est pas sensible à la casse. Les cmdlets seront donc interprétées de la même façon qu’on les saisissent en majuscules, en minuscules ou avec une combinaision de minuscules et de majuscules. |
Les cmdlets disposent également d’alias qui facilitent la saisie de ces commandes.
Exemples :
-
cd
pourSelect-Location
-
echo
pourWrite-Output
La liste de tous les alias disponibles est obtenue grâce à la cmdlet |
Variables dans Microsoft Powershell
Comme tous les langages de programmation, Microsoft Powershell sait manipuler les variables.
Pour rappel, une variable est un emplacement mémoire possédant un nom (→ le nom de la variable) et pouvant contenir une valeur (→ le contenu de la variable).
Dans Microsoft Powershell, les noms de variables commencent systématiquement par un signe dollar ($
) et peuvent inclure des caractères alphanumériques et des caractères spéciaux. La longueur du nom de variable est limitée uniquement par la mémoire disponible.
Cependant, Microsoft recommande de n’utiliser que des caractères alphanumériques et le caractère de soulignement (_
) pour les noms de variable. En effet, ceux qui incluent des espaces et d’autres caractères spéciaux, sont difficiles à utiliser et doivent donc être évités.
L’affectation d’une valeur à une variable se fait avec le signe ‘=’.
$hi="Hello" (1)
1 | On assigne la chaîne de caractères “Hello” à la variable $hi |
Dans Microsoft Powershell, les variables possèdent un type qui caractérise les valeurs qu’elles contiennent.
PS> 2038.GetType().FullName
System.Int32 (1)
PS> "hello".GetType().FullName
System.String (2)
PS> (1,2,3).GetType().FullName
System.Object[] (3)
PS> @{1="un";2="deux";3="trois"}.GetType().FullName
System.Collections.Hashtable (4)
PS> (Get-Date).GetType().FullName
System.DateTime (5)
1 | 2038 est un nombre entier sur 32bits |
2 | "hello" est une chaîne de caractères |
3 | (1,2,3) est un tableau d’objets |
4 | @{1="un";2="deux";3="trois"} est un dictionnaire ou hashtable |
5 | Get-Date retourne un objet de type DateTime |
Par défaut, Le typage est “faible” (→ weak typing). Ceci signifie qu’on peut par exemple changer le type d’une variable après sa création ou qu’une variable de type tableau peut contenir des éléments de différents types.
Un mécanisme existe cependant pour s’assurer qu’une variable ne contiendra qu’un type de valeur, quitte à devoir passer par une conversion au préalable. Ceci peut être assimilé à un typage fort (→ strong typing)
PS> $weakTypingVar=2038 (1)
PS> $weakTypingVar.GetType().FullName
System.Int32
PS> $weakTypingVar="Y2K38 superbug" (2)
PS> $weakTypingVar.GetType().FullName
System.String (3)
PS> $weakTypingVar=2038,"Y2K38 superbug" (4)
PS C:\Users\claud> $weakTypingVar.GetType().FullName
System.Object[]
PS> [int]$strongTypingVar=2038 (5)
PS> $strongTypingVar.GetType().FullName
System.Int32
PS> $strongTypingVar="Y2K38 superbug" (6)
MetadataError: Cannot convert value "Y2K38 superbug" to type "System.Int32". Error: "The input string 'Y2K38 superbug' was not in a correct format." (7)
1 | On déclare une variable faiblement typée et on lui affecte un entier |
2 | On assigne une chaîne à cette variable faiblement typée et… |
3 | … le type de la variable change en conséquence |
4 | On peut même affecter à cette variable faiblement typée un ensemble de valeurs de types différents (entier et chaîne ici). Le type résultant est alors un objet. |
5 | Ici, on déclare et initialise une variable fortement typée devant contenir un entier. Ceci est précisé par le [int] avant le nom de la variable au moment de sa déclaration. |
6 | On essaye d’assigner une chaîne à cette variable fortement typée mais … |
7 | … cela échoue avec un message d’erreur indiquant qu’on ne peut pas convertir une chaîne en entier. |
Enfin, il faut savoir qu’il existe un ensemble de variables dîtes automatiques (voir about_Automatic_Variables ) qui stockent les informations d’état de la machine et qui sont créées puis gérées par Microsoft Powershell.
PS> $HOME (1)
C:\Users\claud
PS> $PSHOME (2)
C:\Program Files\PowerShell\7
PS> $IsWindows (3)
True
1 | chemin complet du répertoire d’accueil de l’utilisateur |
2 | répertoire d’installation de Microsoft Powershell |
3 | indique si la session active s’exécute sur un système d’exploitation Windows |
🞄 🞄 🞄