Adam l’automate

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 Propriétés du système, onglet Avancé

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.

Le dialogue Variables d’environnement

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:\TEMPEnv:\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.

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

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 utilisant appdata. Utilisez plutôt la GetEnvironmentVariable().

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 un Scope paramètre de Process
  • En exécutant 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 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

.

Laisser un commentaire

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