Isso foi abordado um pouco, mas há uma informação crucial que está faltando. Felizmente, posso ajudar a esclarecer como isso funciona e dar algum alívio aos viajantes cansados. :-)
Excluir do processo atual
Obviamente, todo mundo sabe que você apenas faz isso para excluir uma variável de ambiente do seu processo atual:
set FOO=
Exclusão persistente
Existem dois conjuntos de variáveis de ambiente, em todo o sistema e usuário.
Excluir variável de ambiente do usuário:
reg delete "HKCU\Environment" /v FOO /f
Excluir variável de ambiente em todo o sistema:
REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOO
Aplicar valor sem reinicializar
Aqui está a informação mágica que está faltando! Você está se perguntando por que, depois de fazer isso, quando você inicia uma nova janela de comando, a variável de ambiente ainda está lá. O motivo é que o explorer.exe não atualizou seu ambiente. Quando um processo inicia outro, o novo processo herda o ambiente do processo que o iniciou.
Existem duas maneiras de corrigir isso sem reiniciar. A maneira mais bruta é matar o processo explorer.exe e iniciá-lo novamente. Você pode fazer isso no Gerenciador de tarefas . Eu não recomendo este método, no entanto.
A outra maneira é dizer ao explorer.exe que o ambiente mudou e que ele deve relê-lo. Isso é feito transmitindo uma mensagem do Windows (WM_SETTINGCHANGE). Isso pode ser realizado com um script simples do PowerShell. Você pode escrever facilmente um para fazer isso, mas eu encontrei um nas Configurações da Janela de Atualização Após Alterações no 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);
Resumo
Portanto, para excluir uma variável de ambiente do usuário denominada "FOO" e ter a alteração refletida nos processos iniciados posteriormente, faça o seguinte.
- Salve o script do PowerShell em um arquivo (vamos chamá-lo de updateenv.ps1).
- Faça isso na linha de comando: reg delete "HKCU \ Environment" / v FOO / f
- Execute updateenv.ps1.
- Feche e reabra o prompt de comando e você verá que a variável de ambiente não está mais definida.
Observe que você provavelmente precisará atualizar as configurações do PowerShell para permitir a execução desse script, mas deixarei isso como um exercício do Google-fu para você.