web-dev-qa-db-fra.com

Ligne de commande pour supprimer une variable d'environnement de la configuration au niveau du système d'exploitation

Windows a la commande setx :

Description:
    Creates or modifies environment variables in the user or system
    environment.

Vous pouvez donc définir une variable comme celle-ci:

setx FOOBAR 1

Et vous pouvez effacer la valeur comme ceci:

setx FOOBAR ""

Cependant, la variable n'est pas supprimée. Il reste dans le registre:

foobar

Alors, comment voulez-vous réellement supprimer la variable?

146
anon

Pour supprimer la variable de l'environnement actuel ( pas en permanence):

set FOOBAR=

Pour supprimer définitivement la variable de l'environnement utilisateur (qui est l'endroit par défaut que setx met):

REG delete HKCU\Environment /F /V FOOBAR

Si la variable est définie dans l'environnement système (par exemple, si vous l'avez initialement définie avec setx /M), en tant qu'administrateur, exécutez:

REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR

Remarque: Les commandes REG ci-dessus n'affecteront aucun processus existant (et certains nouveaux processus créés à partir de processus existants). Par conséquent, s'il est important que les modifications prennent effet immédiatement, vous pouvez vous connecter. aller et retour ou redémarrer.

168
CupawnTae

Pour supprimer la variable de la session de commande en cours sans la supprimer définitivement, utilisez la commande intégrée set intégrée normale - il suffit de ne rien mettre après le signe égal:

set FOOBAR=

Pour confirmer, exécutez set sans arguments et vérifiez l'environnement actuel. La variable devrait être complètement absente de la liste.

Note: cela ne fera que supprimer la variable de environnement actuel - la modification du registre ne sera pas conservée. Lorsqu'un nouveau processus de commande est démarré, la variable sera de retour.

72
Brian Kelly

Cela a été assez couvert, mais il manque une information cruciale. Si tout va bien, je peux aider à clarifier la façon dont cela fonctionne et donner un certain soulagement aux voyageurs fatigués. :-)

Supprimer du processus en cours

Évidemment, tout le monde sait que vous ne faites que cela pour supprimer une variable d'environnement de votre processus actuel:

set FOO=

Suppression permanente

Il existe deux ensembles de variables d’environnement, l’ensemble du système et l’utilisateur.

Supprimer la variable d'environnement utilisateur:

reg delete "HKCU\Environment" /v FOO /f

Supprimer la variable d'environnement à l'échelle du système:

REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOO

Appliquer une valeur sans redémarrage

Voici l'information magique qui manque! Vous vous demandez pourquoi, après avoir lancé cela, lorsque vous ouvrez une nouvelle fenêtre de commande, la variable d'environnement est toujours présente. La raison en est que Explorer.exe n'a pas mis à jour son environnement. Lorsqu'un processus en lance un autre, le nouveau processus hérite de l'environnement du processus qui l'a lancé.

Il existe deux façons de résoudre ce problème sans redémarrer. Le moyen le plus brutal est de tuer votre processus Explorer.exe et de le redémarrer. Vous pouvez le faire à partir de Gestionnaire des tâches . Je ne recommande pas cette méthode, cependant.

L’autre solution consiste à dire à Explorer.exe que l’environnement a changé et qu’il doit le relire. Cela se fait en diffusant un message Windows (WM_SETTINGCHANGE). Cela peut être accompli avec un simple script PowerShell. Vous pouvez facilement en écrire un pour le faire, mais j'en ai trouvé un dans Paramètres de la fenêtre de mise à jour après les modifications par script:

if (-not ("win32.nativemethods" -as [type])) {
    add-type -Namespace Win32 -Name NativeMethods -MemberDefinition @"
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessageTimeout(
            IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
            uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);
        "@
}

$HWND_BROADCAST = [intptr]0xffff;
$WM_SETTINGCHANGE = 0x1a;
$result = [uintptr]::zero

[win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE,[uintptr]::Zero, "Environment", 2, 5000, [ref]$result);

Résumé

Par conséquent, pour supprimer une variable d'environnement utilisateur nommée "FOO" et que les modifications soient reflétées dans les processus que vous lancez par la suite, procédez comme suit.

  1. Enregistrez le script PowerShell dans un fichier (nous l'appellerons updateenv.ps1).
  2. Faites cela depuis la ligne de commande: reg delete "HKCU\Environment"/v FOO/f
  3. Exécutez updateenv.ps1.
  4. Fermez et rouvrez votre invite de commande et vous verrez que la variable d'environnement n'est plus définie.

Remarque: vous devrez probablement mettre à jour vos paramètres PowerShell pour vous permettre d'exécuter ce script, mais je vais le laisser comme exercice Google-fu pour vous. .

18
Jamie

Je suis d'accord avec CupawnTae .

SET n'est pas utile pour les modifications de l'environnement maître.

FYI: Les variables système sont dans HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment (beaucoup plus longtemps que les utilisateurs vars).

La commande complète pour une variable système nommée FOOBAR est donc:

REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR

(Notez les guillemets nécessaires pour gérer l'espace.)

Il est dommage que la commande setx ne prenne pas en charge la syntaxe de suppression. :(

PS: Utilisez de manière responsable - Si vous tuez votre variable de chemin, ne m'en voulez pas!

13
DougWare

La commande dans réponse de DougWare n'a pas fonctionné, mais cela a fonctionné:

reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v FOOBAR /f

Le raccourci HKLM peut être utilisé pour HKEY_LOCAL_MACHINE.

11
user4297498

De PowerShell , vous pouvez utiliser la méthode .NET [System.Environment]::SetEnvironmentVariable() :

  • Pour supprimer une ser variable d’environnement nommée FOO:

    _[Environment]::SetEnvironmentVariable('FOO', $null, 'User')
    _

Notez que _$null_ est utilisé pour mieux signaler l'intention de supprimer la variable, bien que techniquement, il soit effectivement identique à transmettre _''_ dans ce cas.

  • Pour supprimer une variable d’environnement système (au niveau de la machine) nommée FOO - nécessite une élévation (doit être exécuté en tant qu'administrateur):

    _[Environment]::SetEnvironmentVariable('FOO', $null, 'Machine')
    _

Outre l'exécution plus rapide, l'avantage par rapport à la méthode _reg.exe_- est que les autres applications sont informées du changement , via un message _WM_SETTINGCHANGE_ (même si toutes les applications n'écoutent pas ce message).

9
mklement0
setx FOOBAR ""

provoque simplement que la valeur de FOOBAR soit une chaîne nulle. (Bien que cela apparaisse avec la commande set avec le "" alors peut-être que les guillemets sont la chaîne.)

J'ai utilisé:

set FOOBAR=

et FOOBAR ne figurait plus dans la commande set. (La fermeture de session n'était pas nécessaire.)

Windows 7 32 bits, en utilisant la commande Invite, non-administrateur est ce que j'ai utilisé. (Pas cmd ou Windows + R, qui pourrait être différent.)

BTW, je n'ai pas vu la variable que j'ai créée nulle part dans le registre après l'avoir créée. J'utilise RegEdit pas en tant qu'administrateur.

2
PReinie

Vous pouvez également créer un petit script VBScript :

Set env = CreateObject("WScript.Shell").Environment("System")
If env(WScript.Arguments(0)) <> vbNullString Then env.Remove WScript.Arguments(0)

Puis appelez-le comme %windir%\System32\cscript.exe //Nologo "script_name.vbs" FOOBAR.

L'inconvénient est que vous avez besoin d'un script supplémentaire, mais il ne nécessite pas de redémarrage.

0
Wernfried Domscheit