Comment répertorier les variables d'environnement globales séparément des variables d'environnement spécifiques à l'utilisateur?

13

Sous Windows (par exemple, version 10), vous pouvez répertorier les variables d'environnement à l'aide de la commande

set

Comment répertoriez-vous uniquement les variables d'environnement qui sont les mêmes pour tous les utilisateurs ou uniquement les variables d'environnement qui sont pour l'utilisateur ou la session en cours?

RedGrittyBrick
la source

Réponses:

17

Les choses sont un peu plus compliquées que Microsoft ne le fait parfois croire.

De nombreuses variables d'environnement sont stockées dans le Registre. Cela signifie que vous pouvez les interroger à l'aide de la regcommande

Commun à tous les utilisateurs

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"

Spécifique à la session utilisateur actuelle

reg query HKCU\Environment
reg query "HKCU\Volatile Environment"

Défini par l'utilisateur

Si vous définissez définitivement votre propre variable d'environnement à l'aide de la setx variable valuecommande, elle est stockée dans le registre mais n'est pas immédiatement disponible.

C:\>setx test removeme

SUCCESS: Specified value was saved.

C:\>reg query "HKCU\Environment"

HKEY_CURRENT_USER\Environment
    Path    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
    TEMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp
    TMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp
    test    REG_SZ    removeme

Si vous utilisez la set variable=valuecommande, la variable est disponible immédiatement mais n'est pas stockée dans le registre. Vous ne pouvez pas utiliser la regcommande pour les répertorier bien qu'ils soient affichés par set. Ces variables d'environnement temporaires ne persistent pas après la fin de la session d'invite de commandes.

Variables d'environnement dynamique

Il existe des constructions qui agissent comme des variables d'environnement qui ne sont pas stockées dans le registre de cette manière. Par exemple:

echo %TIME%
RedGrittyBrick
la source
1
Juste une curiosité: est-il possible de rafraîchir la variable précédemment ajoutée au registre? par exemple setx test removemealors quelque chose set test %test%afin que vous puissiez avoir toutes les variables répertoriées avec un simple set? Je pensais qu'il était possible d'implémenter un script de commande / batch pour les rendre explicites sur demande ...
Hastur
@Hastur: Oui, cela fonctionnerait pour rendre une nouvelle variable immédiatement disponible et persistante.
RedGrittyBrick
@hastur @RedGrittyBrick - c'est possible mais ce n'est certainement pas un oneliner dans windows cmd. Si vous installez chocolatey, il a un refreshenv.cmdutilitaire qui est de 10 lignes de code et, fondamentalement, il interroge et actualise les entrées de registre
maoizm
La SETcommande affiche- t-elle les variables d'environnement dynamique? J'essaie de trouver tout et tout ce que les outils de construction de Microsoft ont défini pendant une session, je veux juste couvrir mes bases.
Ungeheuer
2

Pour une sortie nette sans lignes supplémentaires ni espaces noirs, utilisez les commandes suivantes dans cmd.exe:

Variables d'environnement utilisateur:

FOR /F "tokens=1,3* skip=2" %G IN ('reg query HKCU\Environment') DO @echo %G=%H %I

Variables d'environnement globales (système):

FOR /F "tokens=1,3* skip=2" %G IN ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"') DO @echo %G=%H %I

Il fonctionne dans Windows 7-10, et très probablement dans les versions antérieures également.

maoizm
la source
Merci pour cela. Notez qu'il supprime une partie de la valeur s'il contient des espaces. Donc, une entrée de registre comme VS140COMNTOOLS REG_SZ C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools apparaît juste VS140COMNTOOLS=C:\Program.
metal
@metal merci d'avoir signalé ce cas d'angle. N'hésitez pas à modifier la réponse si vous trouvez une solution de contournement pour les espaces - je n'ai pas d'ordinateurs Windows maintenant
maoizm
J'ai soumis une mise à jour à cet effet. Vous ou un mod devrez l'approuver.
métal
1

tapez la commande batch: echo% temp%

Si la variable d'environnement "temp" contient "H: \ Users \ amacm \ AppData \ Local", Windows répondra immédiatement par ce qui suit:

H: \ Users \ amacm \ AppData \ Local

S'il n'y a pas de variable d'environnement nommée "temp", Windows répondra comme suit:

% temp%

Art McDonald
la source