Windows tem o setx
comando:
Description:
Creates or modifies environment variables in the user or system
environment.
Então você pode definir uma variável como esta:
setx FOOBAR 1
E você pode limpar o valor assim:
setx FOOBAR ""
No entanto, a variável não é removida. Ele permanece no registro:
Então, como você realmente removeria a variável?
windows
registry
environment-variables
Peter Mortensen
fonte
fonte
Respostas:
Para remover a variável do ambiente atual ( não permanentemente):
Para remover permanentemente a variável do ambiente do usuário (que é o local padrão
setx
):Se a variável estiver configurada no ambiente do sistema (por exemplo, se você a configurou originalmente
setx /M
), como administrador, execute:Nota: Os
REG
comandos acima não afetarão nenhum processo existente (e alguns novos processos extraídos de processos existentes); portanto, se é importante que a alteração entre em vigor imediatamente, a coisa mais fácil e segura a fazer é sair e voltar ou reinicie. Se essa não é uma opção ou você deseja ir mais fundo, algumas das outras respostas aqui têm ótimas sugestões que podem se adequar ao seu caso de uso.fonte
setx JUNK Hello
. Abra um novo cmd. Digiteecho %JUNK%
e obtenhaHello
. Então eu façoREG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V JUNK
e confirmo que o valor foi retirado do registro. Abro novo cmd e digiteecho %JUNK%
e ainda receboHello
. A busca no registro não mostra presença de 'JUNK'. Por favor, não me diga que você precisa reiniciar!user
comando environment, ele é bem-sucedido. Então, quando redigito o comando que receboThe system was unable to find the specified registry or key value
. Além disso, uma pesquisa globalJUNK
no registro comregedit
nada aparece. Ainda assim, quando abro uma nova janela de comando (via Iniciar / acessórios ou cmd.exe em Executar) e digitoecho %JUNK%
, o valor ainda está lá!SET
lista para o próximo shell do cmd) e, em seguida, removê-lo do registro, por exemplo:SETX FOOBAR "" & REG delete HKCU\Environment /F /V FOOBAR
Para remover a variável da sessão de comando atual sem removê-la permanentemente, use o
set
comando interno regular - basta colocar nada após o sinal de igual:set FOOBAR=
Para confirmar, execute
set
sem argumentos e verifique o ambiente atual. A variável deve estar ausente da lista completamente.fonte
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:
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:
Excluir variável de ambiente em todo o sistema:
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 :
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.
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ê.
fonte
source .bashrc
(ou seus primos) no Windows. Isso vai para o topo da linha "consulte-o" para mim.No PowerShell, você pode usar o
[System.Environment]::SetEnvironmentVariable()
método .NET :Para remover uma variável de ambiente do usuário denominada
FOO
:Observe que
$null
é usado para sinalizar melhor a intenção de remover a variável, embora tecnicamente seja efetivamente o mesmo que passar''
neste caso.Para remover uma variável de ambiente do sistema (no nível da máquina) denominada
FOO
- requer elevação (deve ser executada como administrador):Além da execução mais rápida, a vantagem sobre o
reg.exe
método baseado é que outros aplicativos são notificados da alteração por meio de umaWM_SETTINGCHANGE
mensagem (embora nem todos os aplicativos escutem essa mensagem).fonte
Eu concordo com CupawnTae .
SET
não é útil para alterações no ambiente principal.FYI: As variáveis do sistema estão dentro
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
(muito mais que as variáveis do usuário).O comando completo para uma var do sistema chamada FOOBAR é, portanto:
(Observe as aspas necessárias para lidar com o espaço.)
É uma pena que o
setx
comando não suporte uma sintaxe de exclusão. :(PS: Use com responsabilidade - Se você matar sua variável de caminho, não me culpe!
fonte
O comando na resposta do DougWare não funcionou, mas o seguinte:
O atalho
HKLM
pode ser usado paraHKEY_LOCAL_MACHINE
.fonte
Excluir sem reiniciar
A pergunta do OP realmente foi respondida extensivamente, incluindo como evitar a reinicialização por meio do powershell, vbscript ou qualquer outro nome.
No entanto, se você precisar manter apenas os comandos cmd e não puder se chamar PowerShell ou Vbscript, poderá usar a seguinte abordagem:
Portanto, a mágica aqui é que, usando "setx" para atribuir algo a uma variável que você não precisa (no meu exemplo DUMMY), você força o Explorer.exe a reler as variáveis do registro, sem precisar do PowerShell. Em seguida, você limpa esse manequim e, mesmo que ele fique no ambiente do Explorer por mais algum tempo, provavelmente não fará mal a ninguém.
Ou se, após excluir as variáveis, você precisar definir novas, você nem precisará de nenhum manequim. O simples uso do SETX para definir as novas variáveis limpará automaticamente as que você acabou de remover de quaisquer novas tarefas de cmd que possam começar.
Informações básicas: usei essa abordagem com êxito para substituir um conjunto de variáveis de usuário por variáveis de sistema com o mesmo nome em todos os computadores do meu trabalho, modificando um script cmd existente. Existem computadores demais para fazê-lo manualmente, nem era prático copiar um powershell ou vbscripts extra para todos eles. O motivo pelo qual eu precisava urgentemente substituir o usuário por variáveis do sistema era que as variáveis do usuário eram sincronizadas nos perfis de roaming (não pensamos nisso), então várias máquinas usando o mesmo login do Windows, mas precisando de valores diferentes, se misturaram.
fonte
apenas faz com que o valor de FOOBAR seja uma sequência nula. (Embora seja exibido com o
set
comando com "", talvez seja a aspas duplas).Eu usei:
e, em seguida, FOOBAR não estava mais listado no comando set. (O logoff não era necessário.)
Windows 7 de 32 bits, usando o prompt de comando, não administrador. (Não cmd ou Windows+ R, que pode ser diferente.)
BTW, eu não vi a variável que eu criei em nenhum lugar no registro depois que eu a criei. Estou usando o RegEdit não como administrador.
fonte
Você também pode criar um pequeno script VBScript :
Então chame assim
%windir%\System32\cscript.exe //Nologo "script_name.vbs" FOOBAR
.A desvantagem é que você precisa de um script extra, mas não requer uma reinicialização.
fonte