Déterminer le système d’exploitation avec PowerShell : Windows, Linux, ou macOS ?
Sommaire
I. Présentation
Dans ce tutoriel, nous allons découvrir trois variables automatiques disponibles avec PowerShell : $IsWindows, $IsLinux et $IsMacOS. Ces variables sont disponibles à partir de PowerShell 7.0, ce qui n'est pas anodin, car cela fait plusieurs années que Microsoft propose des versions de PowerShell multi-plateformes. En effet, depuis que PowerShell Core 6.0 est sortie, PowerShell tourne aussi bien sur Windows, Linux, que macOS grâce au fait qu'il s'appuie sur .NET Core, contrairement à Windows PowerShell qui s'appuie sur .NET Framework.
Ces variables sont très pratiques, car elles permettent de savoir si le script est exécuté sur une machine Windows, Linux, ou macOS. De quoi faciliter l'écriture de scripts PowerShell compatibles avec plusieurs systèmes totalement différents.
Remarque : ces variables ne sont pas disponibles avec Windows PowerShell 5.1 (et les versions antérieures)
II. Découverte de $IsWindows, $IsLinux et $IsMacOS
Ces trois variables automatiques sont gérées par PowerShell, comme d'autres variables de ce type ($Error, $_, etc.). Ces variables retournent un booléen, à savoir "true" (vrai) ou "false" (faux) en fonction du système d'exploitation de la machine.
Pour être plus précis, cela donne :
- $IsWindows
Est égal à "true" si la session PowerShell en cours se situe sur une machine Windows, sinon c'est égal à "false".
- $IsLinux
Est égal à "true" si la session PowerShell en cours se situe sur une machine Linux, sinon c'est égal à "false.
- $IsMacOS
Est égal à "true" si la session PowerShell en cours se situe sur une machine macOS, sinon c'est égal à "false".
On fait un test ? Voici ce que ça donne sur ma machine sous Windows :
III. Exécuter un code différent selon le système
De ce fait, on peut imaginer un script dans lequel on va exécuter un code différent en fonction du système. Si l'on prend l'exemple d'un fichier à télécharger et à copier, les chemins ne seront pas les mêmes entre les différents systèmes, d'où l'intérêt d'utiliser ce type de variables.
if($isWindows -eq $true){ Write-Output "Système Windows - Le traitement va continuer." # Instructions }elseif($isLinux -eq $true){ Write-Output "Système Linux - Le traitement va continuer." # Instructions }elseif($isMacOS -eq $true){ Write-Output "Système macOS - Le traitement va continuer." # Instructions }else{ Write-Warning "Système d'exploitation inconnu" }
En utilisant cet exemple, vous pouvez ajouter les instructions qui vont bien, en fonction du système.
On pourrait aussi vérifier le système afin d'exécuter le script s'il s'agit bien d'une machine Windows et d'arrêter le traitement si c'est un autre système. Bien sûr, on peut faire la même chose en vérifiant un autre système, en changeant de variable automatique.
Ce qui donne :
if($IsWindows){ Write-Output "Système sous Windows, le script va se poursuivre..." # Instructions }else{ throw "Arrêt du traitement : OS non Windows" }
Le fait d'utiliser "throw" permet de générer une erreur fatale dans le cas où ce n'est pas Windows. De ce fait, le script s'arrête.
IV. Conclusion
Cette astuce PowerShell peut s'avérer bien pratique dans certaines situations d'autant plus que c'est facile à implémenter et à exploiter. Maintenant, vous ne pouvez plus ignorer les variables $IsWindows, $IsLinux et $IsMacOS.