Variables d’environnement PowerShell: Une plongée profonde

Utiliser PowerShell pour définir des variables d’environnement Windows, lire les variables d’environnement et créer de nouvelles variables d’environnement est facile une fois que vous connaissez l’astuce. Les astuces que vous apprendrez dans cet article fonctionneront pour les variables d’environnement de Windows 10 ainsi que pour n’importe quel client/serveur Windows après Windows 7 SP1/Windows Server 2008.

PowerShell offre de nombreuses façons différentes d’interagir avec les variables d’environnement Windows à partir du PSDrive $env:, du registre et de la classe [System.Environment] de .NET. Vous apprendrez chaque méthode, y compris la compréhension de la portée des variables d’environnement, dans cette démonstration étape par étape.

Hypothèses

Tout au long de cet article, j’utiliserai Windows PowerShell 5.1 sur Windows 10. Mais si vous avez une version de Windows PowerShell supérieure à v3 sur Windows 7 SP1 ou ultérieur, les techniques que je m’apprête à vous montrer devraient fonctionner parfaitement.

Qu’est-ce que les variables d’environnement ?

Les variables d’environnement, comme leur nom l’indique, stockent des informations sur l’environnement utilisé par Windows et les applications. Les variables d’environnement peuvent être accédées par des applications graphiques telles que Windows Explorer et des éditeurs de texte simples comme Notepad, ainsi que par cmd.exe et PowerShell.

L’utilisation de variables d’environnement vous permet d’éviter la codification en dur des chemins d’accès aux fichiers, des noms d’utilisateurs ou d’ordinateurs, et bien plus encore, dans vos scripts ou modules PowerShell.

Variables d’environnement courantes

Au fur et à mesure que vous apprenez à travailler avec les variables d’environnement dans PowerShell, vous rencontrerez de nombreuses variables différentes. Certaines sont plus utiles que d’autres. Voici une liste de certaines des variables d’environnement courantes et de leur utilisation à titre de référence.

Variable Usage
ClientName The name of the remote computer connected via a Remote Desktop session.
SessionName This helps to identify if the current Windows session is regarded by the operating system as running at the console. For console sessions SessionName will be ‘Console’. Enhanced Session connections to Hyper-V Virtual Machines do not report SessionName as ‘Console’, whereas Standard Sessions do.
ComputerName The name of the computer.
SystemRoot and Windir The path to the current Windows installation.
ProgramFiles and ProgramFiles(x86) The default locations for x64 and x86 programs.
ProgramW6432 The default location for programs, avoiding 32/64 bit redirection. This variable only applies for 32 bit processes running on a 64 bit platform. This means that you can use it to identify when a 32 bit instance of PowerShell is running on a 64 bit system.
UserDNSDomain The Fully Qualified Domain Name of the Active Directory domain that the current user logged on to. Only present for domain logons.
UserDomain The NETBIOS-style name of the domain that the current user logged on to. Can be a computer name if there’s no domain.
UserDomainRoamingProfile The location of the central copy of the roaming profile for the user, if any. Only present for domain logons.
UserName The name of the currently logged on user.
UserProfile The location of the profile of the current user on the local computer.

Portée des variables d’environnement

Il existe trois portées de variables d’environnement. Pensez aux portées comme des couches de variables qui s’accumulent pour donner une image complète. Ensemble, ces « couches » fournissent de nombreuses variables d’environnement différentes à tout processus en cours d’exécution dans Windows.

Hiérarchie de la portée des variables d’environnement

Chacune de ces « couches » se combine ou s’écrase mutuellement. Elles sont définies dans une hiérarchie telle que : machine -> utilisateur -> processus, chaque variable de portée écrasant la variable parent si une variable parent existe dans la portée parente.

Par exemple, une variable d’environnement courante est TEMP. Cette variable stocke le chemin d’accès au dossier temporaire local de Windows. Cette variable d’environnement est définie comme suit :

  • C:\WINDOWS\TEMP in the machine scope
  • C:\Users\<username>\AppData\Local\Temp in the user scope
  • C:\Users\<username>\AppData\Local\Temp in the process scope.

Si aucune variable d’environnement TEMP n’est définie dans la portée utilisateur, le résultat final sera C:\WINDOWS\TEMP.

Types de portée des variables d’environnement

Il existe trois types de portée différentes pour les variables d’environnement sous Windows.

Machine

Les variables d’environnement dans la portée machine sont associées à l’instance en cours d’exécution de Windows. Tout compte utilisateur peut les lire, mais les définir, les modifier ou les supprimer nécessite des privilèges élevés.

Utilisateur

Les variables d’environnement dans la portée utilisateur sont associées à l’utilisateur qui exécute le processus en cours. Les variables utilisateur écrasent les variables de portée machine- ayant le même nom.

Note : Microsoft recommande que les valeurs des variables d’environnement de portée Machine et Utilisateur ne dépassent pas 2048 caractères.

Processus

Les variables d’environnement dans la portée processus sont une combinaison des portées machine et utilisateur, ainsi que certaines variables créées dynamiquement par Windows.

Ci-dessous se trouve une liste des variables d’environnement disponibles pour un processus en cours d’exécution. Toutes ces variables sont créées dynamiquement.

  • ALLUSERSPROFILE
  • APPDATA
  • COMPUTERNAME
  • HOMEDRIVE
  • HOMEPATH
  • LOCALAPPDATA
  • LOGONSERVER
  • PROMPT
  • PUBLIC
  • SESSION
  • SystemDrive
  • SystemRoot
  • USERDNSDOMAIN
  • USERDOMAIN
  • USERDOMAIN_ROAMINGPROFILE
  • USERNAME
  • USERPROFILE

Variables d’environnement dans le Registre

Les variables d’environnement sont stockées dans deux emplacements du registre, l’un pour la portée utilisateur et l’autre pour la portée machine.

Ne pas utiliser le registre pour gérer les variables d’environnement

Il y a un problème lors de la modification des variables à l’intérieur du registre. Les processus en cours d’exécution ne verront pas les modifications des variables dans le registre. Les processus ne voient que les variables et les valeurs du registre qui étaient présentes lors du démarrage du processus, à moins que Windows ne les informe d’un changement.

Au lieu de modifier directement le registre, vous pouvez utiliser une classe .NET à la place. La classe .NET [System.Environment] peut modifier les variables d’environnement à portée machine et utilisateuret gérer l’entretien du registre pour vous.

Modifier directement les variables d’environnement dans le registre, bien que possible, n’a pas de sens. La classe .NET offre une approche plus simple et prise en charge par Microsoft. Vous apprendrez à utiliser la classe .NET [System.Environment] plus tard dans cet article.

Emplacements du registre des variables d’environnement et requête

I hope you’ve been convinced to not modify the registry directly but if you’d like to take a peek at what’s in there, you can find all user environment variables in the HKEY_CURRENT_USER\Environment key. Machine-scoped environment variables are stored at HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment.

À l’intérieur de l’une de ces clés se trouvent des valeurs de registre de type REG_SZ ou REG_EXPAND_SZ. Les valeurs REG_EXPAND_SZ contiennent des variables d’environnement intégrées à leur valeur. Ces variables d’environnement sont développées lorsque la valeur est récupérée.

Pour le démontrer, utilisez l’utilitaire REG. Il s’agit d’un petit utilitaire en ligne de commande inclus avec Windows.

Interrogez la variable d’environnement TEMP comme indiqué ci-dessous. Exécutez REG avec le paramètre QUERY pour récupérer la valeur de la variable TEMP.

> REG QUERY HKCU\Environment /V TEMP

HKEY_CURRENT_USER\Environment     
    TEMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp

Vous remarquerez parfois que les variables d’environnement sont affichées entre symboles de pourcentage (%COMPUTERNAME%) comme indiqué ci-dessus. Il s’agit de la méthode ancienne pour afficher les variables d’environnement via cmd.exe et les fichiers batch. Sachez que PowerShell ne reconnaît pas ce format.

L’utilitaire REG nous permet de voir la valeur native de la valeur du registre. Le type de valeur est REG_EXPAND_SZ et la valeur contient la variable d’environnement %USERPROFILE%.

Si vous préférez utiliser PowerShell pour récupérer la valeur du registre, vous pouvez le faire en utilisant la cmdlet Get-Item comme indiqué ci-dessous.

PS51> Get-ItemProperty -Path HKCU:\Environment -Name TEMP

TEMP         : C:\Users\<your username>\AppData\Local\Temp
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Environment
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER
PSChildName  : Environment
PSDrive      : HKCU
PSProvider   : Microsoft.PowerShell.Core\Registry

Afficher et définir les variables d’environnement Windows via l’interface graphique

Pour afficher une vue graphique des variables d’environnement utilisateur et système, exécutez SystemPropertiesAdvanced.exe à partir de PowerShell, d’une invite de commande ou en appuyant sur la touche Windows+R pour afficher l’onglet Propriétés système avancées. Cliquez sur le bouton Variables d’environnement, qui est mis en évidence dans l’image ci-dessous.

The System Properties dialog, Advanced tab

La boîte de dialogue Variables d’environnement, affichée ci-dessous, vous permet de voir, créer et modifier des variables d’environnement avec une portée utilisateur et machine. Notez que la boîte de dialogue fait référence aux variables à portée machine comme Variables système.

The Environment Variables dialog

Maintenant que vous avez compris les variables d’environnement, passons à ce qui vous intéresse, les gérer avec PowerShell !

Il existe plusieurs façons différentes d’interagir avec les variables d’environnement en utilisant PowerShell.

  • Le Env: PSDrive et Provider – basé sur la session. Il ne définit que les valeurs des variables d’environnement pour la session PowerShell en cours
  • Les variables $env: – basées sur la session. Il ne définit que les valeurs des variables d’environnement pour la session PowerShell en cours
  • La classe .NET [System.Environment] – vous permet de persister les variables d’environnement à portée utilisateur et système entre les sessions et les redémarrages

Le Env: PSDrive et Provider

L’une des meilleures façons de lire les variables d’environnement est un concept PowerShell connu sous le nom de lecteurs PowerShell (PS drives). Un lecteur PS vous permet de traiter les variables d’environnement comme s’il s’agissait d’un système de fichiers via le lecteur Env:.

Basculer vers le lecteur Env:

Comme tous les lecteurs PS, vous y faites référence via des chemins comme Env:\TEMP, Env:\COMPUTERNAME, etc. Mais pour gagner du temps, basculez vers le lecteur Env: comme vous le feriez avec un lecteur de système de fichiers, comme indiqué ci-dessous.

PS51> cd Env:
PS51 Env:\>

## ou

PS51> Set-Location Env:
PS Env:\>

Auto-complétion avec le lecteur Env:

Vous pouvez utiliser les mêmes commandes que celles utilisées pour accéder à un système de fichiers, telles que Get-Item et Get-ChildItem pour accéder aux variables d’environnement. Mais au lieu du système de fichiers, vous lisez le lecteur Env:.

Étant donné que les variables d’environnement sont stockées dans un lecteur PS, vous pouvez utiliser la fonction de complétion automatique de PowerShell pour parcourir les variables disponibles, comme indiqué ci-dessous.

Env: tab completion – finding environment variables starting with the letter C

Passons maintenant à quelques exemples d’utilisation du lecteur PS Env: pour travailler avec les variables d’environnement.

Liste des variables d’environnement avec Env:

PS51> Get-Item -Path Env:
PS51> Get-Item -Path Env:USERNAME

Liste des variables d’environnement en utilisant un joker avec Env:

PS51> Get-Item -Path Env:user*

Recherche des valeurs des variables d’environnement avec Env:

Les résultats de ces commandes sont des objets .NET [System.Collections.DictionaryEntry] clé/valeur. Ces objets contiennent le nom de la variable d’environnement dans la propriété Name et la valeur dans la propriété Value.

Vous pouvez accéder à une valeur spécifique d’une variable d’environnement en enveloppant la référence de la commande Get-Item entre parenthèses et en faisant référence à la propriété Value comme indiqué ci-dessous :

PS51> (Get-Item -Path Env:computername).Value
MYCOMPUTERHOSTNAME

Dans les situations où vous devez uniquement retourner certaines variables d’environnement, utilisez des cmdlets PowerShell standard tels que Select-Object et Where-Object pour sélectionner et filtrer les objets renvoyés par le fournisseur Env:.

Dans l’exemple ci-dessous, seule la variable d’environnement COMPUTERNAME est renvoyée.

PS51> Get-ChildItem -Path Env: | Where-Object -Property Name -eq 'COMPUTERNAME'

Comme méthode alternative, utilisez la cmdlet Get-Content. Cette cmdlet renvoie un objet [String] contenant la valeur de la variable d’environnement. Cet objet est plus simple à manipuler car il ne renvoie que la valeur, plutôt qu’un objet avec les propriétés Name et Value.

PS51> Get-Content -Path Env:\COMPUTERNAME

Démonstration : insertion de valeurs d’environnement dans une chaîne de caractères

Avec Get-Content, vous pouvez trouver la valeur d’une variable d’environnement et insérer la variable d’environnement COMPUTERNAME, par exemple, dans une chaîne de texte.

PS51> 'Computer Name is: {0}' -f (Get-Content -Path Env:COMPUTERNAME)
Computer Name is: MYCOMPUTER

Définition d’une variable d’environnement (et création) avec Env:

Créez de nouvelles variables d’environnement avec PowerShell en utilisant la cmdlet New-Item. Fournissez le nom de la variable d’environnement sous la forme Env:\<NomVariableEnv> pour la valeur Name et la valeur de la variable d’environnement pour le paramètre Value, comme indiqué ci-dessous.

PS51> New-Item -Path Env:\MYCOMPUTER -Value MY-WIN10-PC
Name                           Value
----                           -----
MYCOMPUTER                     MY-WIN10-PC

Utilisez la commande Set-item pour définir une variable d’environnement, ou en créer une nouvelle si elle n’existe pas déjà. Vous pouvez voir ci-dessous qu’en utilisant la commande Set-Item, vous pouvez à la fois créer ou modifier une variable d’environnement.

PS51> Set-Item -Path Env:testvariable -Value "Alpha"

Copier une variable d’environnement avec Env:

Parfois, il arrive que vous ayez besoin de reproduire la valeur d’une variable d’environnement. Vous pouvez le faire en utilisant la commande Copy-Item.

Vous pouvez voir ci-dessous que la valeur de la variable COMPUTERNAME est copiée dans MYCOMPUTER, en écrasant sa valeur existante.

PS51> Get-Item -Path Env:\MYCOMPUTER

Name                           Value
----                           -----
MYCOMPUTER                     MY-WIN10-PC

PS51> Copy-Item -Path Env:\COMPUTERNAME -Destination Env:\MYCOMPUTER
PS51> Get-Item -Path Env:\MYCOMPUTER

Name                           Value
----                           -----
MYCOMPUTER                     WIN10-1903

Supprimer une variable d’environnement avec Env:

Il peut arriver que vous n’ayez plus besoin d’une variable d’environnement. Vous pouvez supprimer les variables d’environnement en utilisant l’une des trois méthodes suivantes :

  • Utiliser la commande Set-Item pour définir une variable d’environnement avec une valeur vide
PS51> Set-Item -Path Env:\MYCOMPUTER -Value ''
PS51> Remove-Item -Path Env:\MYCOMPUTER
  • Utiliser la commande Clear-Item.
PS51> Clear-Item -Path Env:\MYCOMPUTER

Renommer une variable d’environnement avec Env:

Dans les situations où le nom d’une variable d’environnement doit être modifié, vous avez la possibilité de la renommer plutôt que de la supprimer et de la recréer avec le fournisseur Env:.

Utilisez la cmdlet Rename-Item pour changer le nom d’une variable d’environnement tout en conservant sa valeur. Ci-dessous, vous pouvez voir que la variable MYCOMPUTER est renommée en OLDCOMPUTER tout en conservant sa valeur.

PS51> Rename-Item -Path Env:\MYCOMPUTER -NewName OLDCOMPUTER
PS51> Get-Item -Path OLDCOMPUTER
Name                           Value
----                           -----
OLDCOMPUTER                    WIN10-1903

$Env: Variables

Après avoir maîtrisé le lecteur Env: pour traiter les variables d’environnement comme des fichiers, cette section vous montre comment les traiter comme des variables. Une autre façon de gérer les variables d’environnement dans la session est d’utiliser l’analyseur d’expressions PowerShellPowerShell Expression Parser. Cette fonctionnalité vous permet d’utiliser la portée $Env: pour accéder aux variables d’environnement.

Obtenir une variable d’environnement avec $Env:

En utilisant la portée $Env, vous pouvez référencer directement les variables d’environnement sans utiliser de commande comme Get-Item comme indiqué ci-dessous.

PS51> $env:computername

Cette méthode facilite l’insertion de variables d’environnement dans des chaînes de caractères comme ci-dessous:

PS51> "The Computer Name is {0}" -f $env:computername
The Computer Name is WIN10-1809
PS51> "The Computer Name is $env:computername"
The Computer Name is WIN10-1809

Définir ou créer une variable d’environnement avec $Env:

Définir une variable d’environnement en utilisant cette méthode est simple. Cela créera également une nouvelle variable d’environnement si elle n’existe pas déjà, comme indiqué ci-dessous.

PS51> $env:testvariable = "Alpha"

Utilisez la syntaxe += pour ajouter à une valeur existante, plutôt que de l’écraser.

PS51> $env:testvariable = "Alpha"
PS51> $env:testvariable += ",Beta"

PS51> $env:testvariable
Alpha,Beta

Supprimer une variable d’environnement avec $Env:

Pour supprimer une variable d’environnement en utilisant cette méthode, il suffit de définir sa valeur sur une chaîne vide.

PS51> $env:testvariable = ''

Utilisant la classe .NET [System.Environment]

La classe .NET [System.Environment] offre également des méthodes pour obtenir et définir des variables d’environnement. C’est la seule méthode pour accéder directement aux différents espaces d’environnement et définir des variables d’environnement qui survivent à travers les sessions PowerShell.

Dans tous les exemples suivants, si aucun espace n’est spécifié, l’espace de processus est supposé.

Lors de l’utilisation de [System.Environment], vous utiliserez quelques méthodes différentes de la classe statique .NET . Vous n’avez pas besoin de comprendre ce qu’est une méthode statique. Vous devez seulement comprendre que pour utiliser l’une des techniques que vous êtes sur le point d’apprendre, vous devez d’abord référencer la classe ([System.Environment]) suivie de deux deux-points (::) puis de la méthode.

Liste des variables d’environnement avec [System.Environment]

Si vous souhaitez voir toutes les variables d’environnement dans un espace particulier, vous utiliserez la méthode GetEnvironmentVariables. Cette méthode renvoie toutes les variables d’environnement selon l’espace spécifié en tant qu’argument de la méthode (entre parenthèses).

Listing environment variables with GetEnvironmentVariable in each scope
PS51> [System.Environment]::GetEnvironmentVariables('User') PS51> [System.Environment]::GetEnvironmentVariables('Machine') PS51> [System.Environment]::GetEnvironmentVariables('Process') # Identique à Process PS51> [System.Environment]::GetEnvironmentVariables()

Obtention de variables d’environnement individuelles avec [System.Environment]

Si vous devez trouver une variable d’environnement spécifique, vous pouvez le faire de deux manières différentes.

  • GetEnvironmentVariables().<nom de la variable> – non recommandé
  • GetEnvironmentVariable('<nom de la variable>','<portée>')

GetEnvironmentVariables()

En utilisant la méthode GetEnvironmentVariables(), vous utilisez la notation point pour référencer la valeur. Entourez la référence de la classe et de la méthode statique [System.Environment] entre parenthèses, suivie d’un point puis du nom de la variable d’environnement comme ci-dessous:

PS51> ([System.Environment]::GetEnvironmentVariables()).APPDATA

Notez que lorsque vous référencez des variables d’environnement de cette manière, vous devez vous assurer de respecter la casse ! Dans l’exemple ci-dessus, essayez de référencer la variable APPDATA en utilisant appdata. Utilisez plutôt la méthode GetEnvironmentVariable().

GetEnvironmentVariable()

Au lieu d’utiliser la méthode GetEnvironmentVariables(), utilisez plutôt GetEnvironmentVariable() pour trouver des variables d’environnement individuelles. Cela contourne le problème de la casse et vous permet également de spécifier la portée.

Pour utiliser cette méthode, spécifiez le nom de la variable d’environnement et la portée dans laquelle vous souhaitez rechercher cette variable, séparés par une virgule.

PS51> [System.Environment]::GetEnvironmentVariable('ComputerName','User')
# Vide

PS51> [System.Environment]::GetEnvironmentVariable('ComputerName','Machine')
# Vide

PS51> [System.Environment]::GetEnvironmentVariable('ComputerName','Process')  WIN10-1903

# Identique à Process
PS51> [System.Environment]::GetEnvironmentVariable('ComputerName')
WIN10-1903

Définition d’une variable d’environnement avec [System.Environment]

Utilisez la méthode SetEnvironmentVariable() pour définir la valeur d’une variable d’environnement pour la portée donnée, ou en créer une nouvelle si elle n’existe pas déjà.

Lors de la définition de variables dans la portée du processus, vous constaterez que la portée du processus est volatile tandis que les modifications apportées aux portées utilisateur et machine sont permanentes.

PS51> [System.Environment]::SetEnvironmentVariable('TestVariable','Alpha','User')

PS51> [System.Environment]::SetEnvironmentVariable('TestVariable','Alpha','Process')

PS51> [System.Environment]::SetEnvironmentVariable('TestVariable','Alpha','Machine')

 # Identique à Process
PS51> [System.Environment]::SetEnvironmentVariable('TestVariable','Alpha')

Remarque : Appeler la méthode SetEnvironmentVariable avec un nom de variable ou une valeur de 32767 caractères ou plus provoquera une exception.

Suppression d’une variable d’environnement avec [System.Environment]

Utilisez la méthode SetEnvironmentVariable() pour supprimer une variable d’environnement pour la portée donnée en définissant sa valeur sur une chaîne vide.

PS51> [System.Environment]::SetEnvironmentVariable('TestVariable', '', 'User')

PS51> [System.Environment]::SetEnvironmentVariable('TestVariable', '', 'Process')

PS51> [System.Environment]::SetEnvironmentVariable('TestVariable', '', 'Machine')

# Identique à processus
PS51> [System.Environment]::SetEnvironmentVariable('TestVariable', '')

Variables d’environnement PowerShell utiles

Comme de nombreuses autres applications Windows, PowerShell dispose de ses propres variables d’environnement. Deux variables d’environnement utiles à connaître sont PSExecutionPolicyPreference et PSModulePath.

PSExecutionPolicyPreference

La variable d’environnement PSExecutionPolicyPreference stocke la stratégie d’exécution PowerShell actuelle. Elle est créée si une stratégie d’exécution PowerShell spécifique à la session est définie par :

  • L’exécution de la cmdlet Set-ExecutionPolicy avec un paramètre Scope de Process
  • L’exécution de l’exécutable powershell.exe pour démarrer une nouvelle session, en utilisant le paramètre de ligne de commande ExecutionPolicy pour définir une stratégie pour la session.

PSModulePath

La variable d’environnement PSModulePath contient le chemin que PowerShell recherche pour les modules si vous ne spécifiez pas un chemin complet. Elle est formée de la même manière que la variable d’environnement standard PATH, avec des chemins de répertoire individuels séparés par un point-virgule.

PS51> $env:PSModulePath
C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

Astuce rapide : Divisez chaque dossier pour obtenir un tableau de chaînes afin de traiter chaque chemin individuellement en utilisant $env:PSModulePath.split(‘;’)

Résumé

Les variables d’environnement sont une méthode utile pour obtenir des informations sur un système en cours d’exécution ou stocker des informations entre les sessions et les redémarrages. Que vous lisiez les variables d’environnement par défaut du système d’exploitation Windows et que vous en créiez les vôtres, vous pouvez maintenant les gérer de différentes manières avec PowerShell !

Lectures complémentaires

Source:
https://adamtheautomator.com/powershell-environment-variables/