Les variables d’environnement
Sommaire
I. Présentation
Dans ce chapitre, nous allons voir étudier la notion de variables d'environnement sous Windows, et nous verrons comment manipuler ces variables d'environnements à l'aide de quelques commandes PowerShell.
Contrairement aux variables déclarées dans un script ou le temps d'une session PowerShell, les variables d'environnement sont enregistrées au niveau du système. Avant de passer à la pratique, je vous propose un rappel sur la notion de variables d'environnement.
II. C'est quoi une variable d'environnement ?
Une variable d'environnement est une variable dynamique et globale au sein d'un système d'exploitation. Les différents processus de la machine peuvent accéder à ces variables pour obtenir des informations sur la configuration actuelle du système, en l'occurrence Windows dans notre exemple. Les autres systèmes comme Linux et macOS utilisent des variables d'environnement aussi. Autrement dit, une variable d'environnement n'est pas liée directement à PowerShell.
Sur Windows, on retrouve plusieurs dizaines de variables d'environnement, dont celles-ci qui sont très pratiques :
- ComputerName : nom de l'ordinateur
- LogonServer : serveur utilisé pour authentifier la session actuelle, généralement un contrôleur de domaine Active Directory en entreprise, ou l'hôte local s'il s'agit d'une session locale
- SystemDrive : lettre du lecteur où est installé Windows, généralement "C:"
- Username : nom de l'utilisateur actuellement connecté sur la machine
- UserProfile : chemin vers le profil Windows de l'utilisateur
- UserDnsDomain : le nom complet (nom DNS) lors de la connexion à un domaine
- UserDomain : le nom court du domaine Active Directory
- Processor_Architecture : architecture du processeur, par exemple AMD64
Ces variables d'environnement sont très utilisées par le système d'exploitation, mais aussi par les logiciels installés sur votre machine, et elles sont aussi très utiles dans les scripts. Le nom de l'ordinateur est récupérable via la variable d'environnement "ComputerName", c'est très pratique, car la valeur va s'adapter d'une machine à une autre, ce qui rendra le script plus versatile.
Quand je dis que ces variables sont dynamiques, c'est que la valeur peut évoluer dans le temps, en fonction de la configuration matérielle de l'ordinateur, mais également de sa configuration et même de l'utilisateur connecté sur l'ordinateur.
Par exemple, si je me connecte avec l'utilisateur "florian" sur mon PC, la variable d'environnement "Username" aura la valeur "florian". Ensuite, si je me connecte avec l'utilisateur "it-connect", la variable "Username" prendra pour valeur "it-connect", etc.
III. Lister les variables d'environnement avec PowerShell
Ouvrez une console PowerShell ou Windows PowerShell, car nous allons commencer à manipuler. Pour lister l'ensemble des variables d'environnement, nous devons interroge le lecteur de variables d'environnement : "Env:". Comme nous le ferions pour lister le contenu d'un dossier, nous allons utiliser la commande "Get-ChildItem", ce qui donne :
Get-ChildItem Env:
Comme vous pouvez le voir sur l'image ci-dessous, toutes les variables d'environnement sont affichées. Nous avons le nom et la valeur de chaque variable.
Avec l'alias de "Get-ChildItem", ça fonctionne aussi et c'est plus court :
gci env:
Si l'on veut afficher la valeur d'une variable spécifique, nous pouvons préciser son nom à la suite de "env:", comme ceci :
gci env:computername
Par exemple, la variable d'environnement "PSModulePath" nous donne les chemins vers les différents répertoires où PowerShell regarde pour charger ses modules.
gci env:psmodulepath
Cela retourne :
C:\Users\florian\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
Cette sortie n'est pas très lisible parce que tous les chemins sont sur la même ligne. Pour préciser un chemin par ligne, nous pouvons découper la chaîne en ciblant le caractère ";" avec la méthode "Split()", comme ceci :
($env:PSModulePath).split(";")
IV. Utiliser une variable d'environnement dans un script PowerShell
Historiquement, lorsque l'on utilisait l'Invite de commandes et les commandes MS-DOS, pour consulter une variable d'environnement, il suffisait d'encadrer son nom avec le symbole "%". Par exemple :
%COMPUTERNAME%
Sauf qu'en PowerShell cette syntaxe ne fonctionne pas ; l'écriture est différente. Pour utiliser une variable d'environnement afin de récupérer sa valeur, nous allons utiliser cette syntaxe :
$env:<nom de la variable>
Par exemple, pour obtenir le nom de l'ordinateur via la lecture de la variable d'environnement "COMPUTERNAME" :
$env:COMPUTERNAME
Lors de l'exécution de cette commande, PowerShell va lire le contenu de la variable d'environnement et l'afficher dans la console. Le nom de l'ordinateur sera retourné.
De cette façon, nous pouvons utiliser n'importe quel variable d'environnement dans un script PowerShell. Par exemple, pour afficher le nom de votre ordinateur, exécutez :
Write-Host "Le nom de mon ordinateur est $env:computername"
Il y a une variable qui est très utilisée, notamment par les logiciels, c'est la variable "USERPROFILE" car elle permet d'obtenir le chemin du profil de l'utilisateur actuel. Pour l'afficher, le principe est le même que la précédente variable :
$env:USERPROFILE
J'en profite aussi pour vous préciser que vous pouvez écrire les noms de variable en majuscules ou minuscules, cela n'a pas d'importance.
V. Modifier une variable d'environnement avec PowerShell
Il est possible de modifier une variable temporairement, le temps d'un script par exemple. Pour cela, on peut utiliser "Set-Item" pour modifier la variable. Par exemple, pour ajouter le répertoire "C:\PS_MODULES" à la variable "PSModulePath", nous allons utiliser cette commande :
Set-Item -Path Env:PSModulePath -Value ($Env:PSModulePath + ";C:\PS_MODULES")
Le caractère ";" devant le nom du chemin est important pour agir comme séparateur entre la valeur que l'on ajoute et la valeur précédente. Le fait d'utiliser "($Env:PSModulePath + ";C:\PS_MODULES")" permets de reprendre les valeurs actuelles et d'ajouter notre valeur.
Voici une autre syntaxe pour ajouter notre chemin supplémentaire :
$env:psmodulepath += ";C:\PS_MODULES"
Si nous voulons que la variable "PSModulePath" contienne seulement le dossier "C:\PS_MODULES", nous devons faire :
Set-Item -Path Env:PSModulePath -Value "C:\PS_MODULES"
Tout cela n'est que temporaire et s'applique à la session PowerShell en cours. Si vous fermez la console et que vous la rouvrez, votre modification sera perdue !
Note : pour créer une variable d'environnement temporaire, nous allons utiliser la commande : New-Item -Path Env:itconnect -Value "www.it-connect.fr". La commande précédente permet de créer une variable nommée "itconnect" avec la valeur "www.it-connect.fr".
Pour modifier de façon persistante une variable d'environnement, il faut utiliser la class .NET "[System.Environment]" d'après la documentation. Cependant, cette méthode ne fonctionne pas du tout à chaque fois... Dommage. La modification est effectuée temporairement aussi.
Voici une commande pour ajouter le chemin "C:\PS_MODULES" à la variable d'environnement "PATH".
[System.Environment]::SetEnvironmentVariable("Path",$Env:Path + ";C:\PS_MODULES")
Si vous connaissez une méthode fiable pour modifier une variable d'environnement de façon persistante, je suis preneur. Sinon, la meilleure méthode reste la modification via l'interface graphique.