PowerShell et les variables d’environnement

I. Présentation

Dans ce tutoriel, nous allons voir comment manipuler les variables d'environnement sous Windows à l'aide de PowerShell et quelques commandes utiles.

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.

Sur Windows, on retrouve plusieurs dizaines de variables d'environnement, dont :

  • 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 actuel
  • UserProfile : chemin vers le profil Windows de l'utilisateur
  • 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 récupérable via "ComputerName", c'est très pratique.

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 aussi 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, on interroger le lecteur de variables d'environnement : Env:. Comme on le ferait pour lister le contenu d'un dossier, on va 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.

Get-ChildItem Env:
Get-ChildItem Env:

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, on peut 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, on peut découper la chaîne en ciblant le caractère ";", 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 suffisant 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, on va utiliser cette syntaxe :

$env:<nom de la variable>

Par exemple pour le nom de l'ordinateur :

$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é.

Variable d'environnement COMPUTERNAME en PowerShell
Variable d'environnement COMPUTERNAME en PowerShell

De cette façon, on peut 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, on va 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 l'on veut que la variable PSModulePath contienne seulement le dossier "C:\PS_MODULES", on doit 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, on va 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.

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian Burnel

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

florian has 3486 posts and counting.See all posts by florian

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

 

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