Cela a été un peu couvert, mais il manque une information cruciale. J'espère que je pourrai vous aider à comprendre comment cela fonctionne et à soulager les voyageurs fatigués. :-)
Supprimer du processus actuel
De toute évidence, tout le monde sait que vous faites cela pour supprimer une variable d'environnement de votre processus actuel:
set FOO=
Suppression persistante
Il existe deux ensembles de variables d'environnement, à l'échelle du système et 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 la valeur sans redémarrer
Voici les informations magiques qui manquent! Vous vous demandez pourquoi après avoir fait cela, lorsque vous lancez une nouvelle fenêtre de commande, la variable d'environnement est toujours là. 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 du Gestionnaire des tâches . Cependant, je ne recommande pas cette méthode.
L'autre façon est de 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 ce faire, mais j'en ai trouvé un dans les paramètres de la fenêtre de mise à jour après les modifications scriptées :
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é
Donc, pour supprimer une variable d'environnement utilisateur nommée "FOO" et que le changement soit reflété dans les processus que vous lancez par la suite, procédez comme suit.
- Enregistrez le script PowerShell dans un fichier (nous l'appellerons updateenv.ps1).
- Faites cela à partir de la ligne de commande: reg delete "HKCU \ Environment" / v FOO / f
- Exécutez updateenv.ps1.
- Fermez et rouvrez votre invite de commande, et vous verrez que la variable d'environnement n'est plus définie.
Notez que vous devrez probablement mettre à jour vos paramètres PowerShell pour vous permettre d'exécuter ce script, mais je laisserai cela comme un exercice Google-fu pour vous.