Utiliser PowerShell pour définir les variables d’environnement de 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 apprenez dans cet article fonctionneront pour les variables d’environnement de Windows 10 ainsi que pour tout client/serveur Windows postérieur à Windows 7 SP1/Windows Server 2008.
PowerShell fournit de nombreuses méthodes différentes pour interagir avec les variables d’environnement Windows à partir du $env:
PSDrive. du registre et de la classe .NET. Vous apprendrez à connaître chaque méthode, notamment à comprendre la portée des variables d’environnement, dans cette marche à suivre étape par étape.
Table des matières
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 postérieure à la v3 sur Windows 7 SP1 ou plus, les techniques que je vais vous montrer devraient fonctionner parfaitement.
Que sont 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 sont accessibles par des applications graphiques telles que l’Explorateur Windows et des éditeurs de texte brut comme Notepad, ainsi que par cmd.exe et PowerShell.
L’utilisation des variables d’environnement vous permet d’éviter de coder en dur les chemins d’accès aux fichiers, les noms d’utilisateur ou d’ordinateur et bien plus encore dans vos scripts ou modules PowerShell.
Variables d’environnement courantes
Alors que vous commencerez à en savoir plus sur la façon de travailler avec les variables d’environnement dans PowerShell, vous rencontrerez de nombreuses variables différentes. Certaines sont plus utiles que d’autres. Vous trouverez ci-dessous une liste de certaines des variables d’environnement les plus courantes et leur utilisation à titre de référence.
Variable | Usage | |
---|---|---|
ClientName | Le nom de l’ordinateur distant connecté via une session Remote Desktop. | |
SessionName | Cela permet d’identifier si la session Windows actuelle est considérée par le système d’exploitation comme s’exécutant à la console. Pour les sessions de type console, SessionName sera ‘Console’. Les connexions de sessions améliorées aux machines virtuelles Hyper-V ne signalent pas SessionName comme ‘Console’, alors que les sessions standard le font. | |
ComputerName | Le nom de l’ordinateur. | |
SystemRoot et Windir | Le chemin d’accès à l’installation Windows actuelle. | |
ProgramFiles et ProgramFiles(x86) | L’emplacement par défaut des programmes x64 et x86. | ProgramW6432 | L’emplacement par défaut des programmes, évitant la redirection 32/64 bits. Cette variable ne s’applique que pour les processus 32 bits exécutés sur une plateforme 64 bits. Cela signifie que vous pouvez l’utiliser pour identifier quand une instance 32 bits de PowerShell s’exécute sur un système 64 bits. |
UserDNSDomain | Le nom de domaine entièrement qualifié du domaine Active Directory auquel l’utilisateur actuel s’est connecté. Uniquement présent pour les connexions au domaine. | |
UserDomain | Le nom de style NETBIOS du domaine auquel l’utilisateur actuel s’est connecté. Peut être un nom d’ordinateur s’il n’y a pas de domaine. | |
UserDomainRoamingProfile | L’emplacement de la copie centrale du profil itinérant pour l’utilisateur, le cas échéant. Uniquement présent pour les connexions de domaine. | |
UserName | Le nom de l’utilisateur actuellement connecté. | |
UserProfile | L’emplacement du profil de l’utilisateur actuel sur l’ordinateur local. |
Scopes des variables d’environnement
Il existe trois scopes de variables d’environnement. Pensez aux scopes comme des couches de variables qui s’accumulent pour donner une image totale. Combinées, ces « couches » fournissent de nombreuses variables d’environnement différentes à tout processus en cours d’exécution dans Windows.
Scope des variables d’environnement « Hiérarchie »
Chacune de ces « couches » se combinent ou s’écrasent les unes les autres. Elles sont définies dans une hiérarchie du type : machine -> utilisateur -> processus, chaque variable de portée écrasant la variable parent si elle existe dans la portée parent.
Par exemple, une variable d’environnement commune est TEMP
. Cette variable stocke le chemin d’accès au dossier temporaire local de Windows. Cette variable d’environnement est définie sur :
Si aucune TEMP
variable d’environnement n’est définie dans la portée de l’utilisateur, alors le résultat final sera C:\WINDOWS\TEMP
.
Types de portée des variables d’environnement
Il existe trois portées de variables d’environnement différentes dans Windows.
Machine
Les variables d’environnement dans la portée de la machine sont associées à l’instance en cours d’exécution de Windows. Tout compte utilisateur peut les lire, mais leur définition, leur modification ou leur suppression doit se faire avec des privilèges élevés.
Utilisateur
Les variables d’environnement dans la portée de l’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 contiennent pas plus de 2048 caractères.
Processus
Les variables d’environnement dans la portée du processus sont une combinaison des portées de la machine et de l’utilisateur, ainsi que de certaines variables que Windows crée dynamiquement.
Vous trouverez ci-dessous 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, un pour la portée de l’utilisateur et un pour la portée de la machine.
Ne pas utiliser le registre pour gérer les variables d’environnement
Il y a un hic lorsque vous apportez des modifications aux variables à l’intérieur du registre. Tout processus en cours d’exécution ne verra pas les changements de variables dans le registre. Les processus ne voient que les variables et les valeurs du registre qui étaient présentes au moment où le processus a été lancé, à moins que Windows ne les informe qu’il y a eu un changement.
Au lieu de modifier le registre directement, vous pouvez utiliser une classe .NET à la place. La classe .NET peut modifier les variables d’environnement de la machine et de l’utilisateur et gérer le ménage 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, prise en charge par Microsoft. Vous apprendrez à utiliser la classe .NET plus tard dans cet article.
Localisation et interrogation des variables d’environnement dans le registre
J’espère vous avoir convaincu de ne pas modifier le registre directement mais si vous souhaitez jeter un coup d’œil à ce qu’il contient, vous pouvez trouver toutes les variables d’environnement de l’utilisateur dans la clé HKEY_CURRENT_USER\Environment
. Les variables d’environnement de la machine sont stockées dans HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
.
À l’intérieur de l’une ou l’autre 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 démontrer cela, utilisez l’utilitaire REG
. Il s’agit d’un petit utilitaire de ligne de commande inclus avec Windows.
Importer la variable d’environnement TEMP
comme vu 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 TEMPHKEY_CURRENT_USER\Environment TEMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp
Vous remarquerez parfois des variables d’environnement affichées entourées de symboles de pourcentage (
%COMPUTERNAME%
) comme ci-dessus. Il s’agit de la façon ancienne d’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 de 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.
Voir et définir les variables d’environnement Windows via l’interface graphique
Pour voir une vue graphique des variables d’environnement utilisateur et système, exécutez SystemPropertiesAdvanced.exe à partir de PowerShell, d’une invite de commande ou de la touche Windows+R pour afficher l’onglet Propriétés système avancées. Cliquez sur le bouton EnvironmentVariables, qui est mis en évidence dans l’image ci-dessous.
La boîte de dialogue Variables d’environnement, illustrée ci-dessous, vous permet d’afficher, de créer et de modifier les variables d’environnement scannées par l’utilisateur et la machine. Notez que la boîte de dialogue fait référence aux variables scopées par la machine en tant que variables Système.
Maintenant que vous avez une compréhension des variables d’environnement, passons à ce pour quoi vous êtes ici, les gérer avec PowerShell !
Il existe plusieurs façons différentes d’interagir avec les variables d’environnement à l’aide de PowerShell.
- La
Env:
PSDrive et le fournisseur – basés sur la session. Définit uniquement les valeurs des variables d’environnement pour la session PowerShell actuelle -
$env:
variables – basées sur la session. Définit uniquement les valeurs des variables d’environnement pour la session PowerShell actuelle - La
classe .NET – vous permet de faire persister les variables d’environnement de l’utilisateur et du système à travers les sessions et les redémarrages
L’Env : PSDrive et Provider
L’un des meilleurs moyens de lire les variables d’environnement est un concept PowerShell connu sous le nom de lecteurs PowerShell (lecteurs PS). Un lecteur PS vous permet de traiter les variables d’environnement comme s’il s’agissait d’un système de fichiers par le biais du Env:
lecteur.
Commutation vers le lecteur Env:
Comme tous les lecteurs PS, vous le référencez via des chemins comme Env:\TEMP
Env:\COMPUTERNAME
, etc. Mais pour économiser quelques frappes, passez au lecteur Env:
comme vous le feriez pour n’importe quel lecteur du système de fichiers, comme indiqué ci-dessous.
PS51> cd Env:PS51 Env:\>## orPS51> Set-Location Env:PS Env:\>
Complément de tabulation avec le Env:
lecteur
Vous pouvez utiliser les mêmes commandes que vous utiliseriez pour accéder à un système de fichiers, comme 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:
.
Parce que les variables d’environnement sont stockées dans un lecteur PS, vous pouvez utiliser la fonction de complétion de tabulation de PowerShell pour parcourir les variables disponibles, comme indiqué ci-dessous.
Sautons maintenant dans quelques exemples de la façon dont vous pouvez utiliser le Env:
lecteur PS pour travailler avec les variables d’environnement.
Lister les variables d’environnement avec Env :
PS51> Get-Item -Path Env:PS51> Get-Item -Path Env:USERNAME
Lister les variables d’environnement en utilisant un caractère générique 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 clé/valeur .NET. 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 référençant la propriété Value
comme indiqué ci-dessous :
PS51> (Get-Item -Path Env:computername).ValueMYCOMPUTERHOSTNAME
Dans les situations où vous devez retourner uniquement certaines variables d’environnement, utilisez les cmdlets PowerShell standard tels que Select-Object
et Where-Object
pour sélectionner et filtrer les objets retournés par le fournisseur Env:
.
Dans l’exemple ci-dessous, seule la variable d’environnement COMPUTERNAME
est retournée.
PS51> Get-ChildItem -Path Env: | Where-Object -Property Name -eq 'COMPUTERNAME'
Comme méthode alternative, utilisez le cmdlet Get-Content
. Cette cmdlet renvoie un objet contenant la valeur de la variable d’environnement. Cet objet est plus simple à traiter car il renvoie uniquement la valeur, plutôt qu’un objet avec des propriétés
Name
et Value
.
PS51> Get-Content -Path Env:\COMPUTERNAME
Démo : Insertion de valeurs d’environnement dans une chaîne de caractères
En utilisant Get-Content
, vous pouvez trouver la valeur d’une variable d’environnement et insérer la COMPUTERNAME
variable d’environnement, par exemple, dans une chaîne de caractères.
PS51> 'Computer Name is: {0}' -f (Get-Content -Path Env:COMPUTERNAME)Computer Name is: MYCOMPUTER
Configuration d’une variable d’environnement (et création) avec Env :
Créer de nouvelles variables d’environnement avec PowerShell en utilisant la New-Item
cmdlet. Fournissez le nom de la variable d’environnement sous la forme Env:\<EnvVarName>
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-PCName Value---- -----MYCOMPUTER MY-WIN10-PC
Utiliser le cmdlet 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 le Set-Item
cmdlet, vous pouvez à la fois créer ou modifier une variable d’environnement.
PS51> Set-Item -Path Env:testvariable -Value "Alpha"
Copie d’une variable d’environnement avec Env :
Il arrive parfois que vous ayez besoin de répliquer la valeur d’une variable d’environnement. Vous pouvez le faire en utilisant le cmdlet Copy-Item
.
Ci-après, vous pouvez voir que la valeur de la variable COMPUTERNAME
est copiée dans MYCOMPUTER
, écrasant sa valeur existante.
Suppression d’une variable d’environnement avec Env :
Il y aura des situations où une variable d’environnement ne sera plus nécessaire. Vous pouvez supprimer les variables d’environnement en utilisant l’une des trois méthodes suivantes :
- Utiliser la cmdlet
Set-Item
pour définir une variable d’environnement à une valeur vide
PS51> Set-Item -Path Env:\MYCOMPUTER -Value ''
- Utiliser la cmdlet
Remove-Item
.
PS51> Remove-Item -Path Env:\MYCOMPUTER
- Utiliser la cmdlet
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 renommer, plutôt que de supprimer et recréer avec le Env:
fournisseur.
Utilisez le Rename-Item
cmdlet 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.
$Env : Variables
Ayant maîtrisé le Env:
lecteur 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 en cours de session consiste à utiliser l’analyseur d’expressions PowerShell. Cette fonctionnalité vous permet d’utiliser la $Env:
portée 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 les variables d’environnement directement sans utiliser une commande comme Get-Item
comme indiqué ci-dessous.
PS51> $env:computername
Cette méthode permet d’insérer facilement des variables d’environnement dans des chaînes de caractères comme ci-dessous :
Configurer ou créer une variable d’environnement avec $Env :
La définition d’une variable d’environnement à l’aide de cette méthode est simple. Cela créera également une nouvelle variable d’environnement si elle n’existe pas déjà comme ci-dessous.
PS51> $env:testvariable = "Alpha"
Utiliser la syntaxe +=
pour ajouter à une valeur existante, plutôt que de l’écraser.
PS51> $env:testvariable = "Alpha"PS51> $env:testvariable += ",Beta"PS51> $env:testvariableAlpha,Beta
Retrait d’une variable d’environnement avec $Env :
Pour supprimer une variable d’environnement à l’aide de cette méthode, il suffit de définir sa valeur sur une chaîne vide.
PS51> $env:testvariable = ''
Utilisation de la classe .NET
La classe .NET propose des méthodes pour obtenir et définir des variables d’environnement également. C’est la seule méthode permettant d’accéder directement à divers scopes d’environnement et de définir des variables d’environnement qui survivent à travers les sessions PowerShell.
Dans tous les exemples suivants, si aucune portée n’est fournie, la portée du processus est supposée.
Lorsque vous utilisez la , vous utiliserez quelques méthodes de classes statiques .NET différentes. 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 allez apprendre, vous devrez d’abord faire référence à la classe (
) suivie de deux deux-points (
::
) puis suivie de la méthode.
Lister les variables d’environnement avec
Si vous souhaitez voir toutes les variables d’environnement dans une portée particulière, vous utiliserez la méthode GetEnvironmentVariables
. Cette méthode renvoie toutes les variables d’environnement par la portée spécifiée comme argument de la méthode (entre parenthèses).
Obtenir des variables d’environnement uniques avec
Si vous devez trouver une variable d’environnement spécifique, vous pouvez le faire de deux manières différentes.
-
GetEnvironmentVariables().<var name>
– non recommandé GetEnvironmentVariable('<var name>','<scope>')
GetEnvironmentVariables()
En utilisant la méthode GetEnvironmentVariables()
, vous utilisez la notation par points pour référencer la valeur. Mettez entre parenthèses la référence de la classe et de la méthode statique suivie d’un point puis du nom de la variable d’environnement comme ci-dessous :
PS51> (::GetEnvironmentVariables()).APPDATA
Notez que lorsque vous référencez des variables d’environnement de cette manière, vous devez vous assurer de faire correspondre les majuscules ! Dans l’exemple ci-dessus, essayez de référencer la variable
APPDATA
en utilisantappdata
. Utilisez plutôt laGetEnvironmentVariable()
.
GetEnvironmentVariable()
Au lieu d’utiliser la méthode GetEnvironmentVariables()
, utilisez plutôt GetEnvironmentVariable()
pour trouver des variables d’environnement uniques. Cela contourne le problème de la capitalisation 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.
Définir une variable d’environnement avec
Utiliser 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à.
Lorsque vous définissez des variables dans la portée du processus, vous constaterez que celle-ci est volatile alors que les modifications apportées aux portées de l’utilisateur et de la machine sont permanentes.
Note : L’appel de la méthode SetEnvironmentVariable avec un nom de variable ou une valeur de 32767 caractères ou plus entraînera la levée d’une exception.
Suppression d’une variable d’environnement avec
Utiliser la méthode SetEnvironmentVariable()
pour supprimer une variable d’environnement pour la portée donnée en fixant sa valeur à une chaîne vide.
Variables d’environnement PowerShell utiles
Comme beaucoup d’autres applications Windows, PowerShell possède quelques variables d’environnement qui lui sont propres. Deux variables d’environnement utiles à connaître sont PSExecutionPolicyPreference
et PSModulePath
.
PSExecutionPolicyPreference
La variable d’environnement PSExecutionPolicyPreference
stocke la politique d’exécution PowerShell actuelle. Elle est créée si une politique d’exécution PowerShell spécifique à la session est définie par :
- En exécutant le cmdlet
Set-ExecutionPolicy
avec unScope
paramètre deProcess
- En exécutant l’exécutable
powershell.exe
pour démarrer une nouvelle session, en utilisant le paramètre de ligne de commandeExecutionPolicy
pour définir une politique 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 à peu près comme la variable d’environnement standard PATH
, avec des chemins de répertoire individuels séparés par un point-virgule.
PS51> $env:PSModulePathC:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
Conseil rapide : séparez 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 pour stocker des informations à travers les sessions et les redémarrages. Que vous vous contentiez de lire les variables d’environnement par défaut du système d’exploitation Windows et de créer les vôtres, vous pouvez maintenant les gérer en utilisant diverses méthodes avec PowerShell !
Lecture complémentaire
- about_Environment_Variables
- La classe .NET sur Microsoft docs
- Apprendre le format de chaîne PowerShell et l’expansion des chaînes
.