Se eu modificar ou adicionar uma variável de ambiente, tenho que reiniciar o prompt de comando. Existe um comando que eu poderia executar que faria isso sem reiniciar o CMD?
windows
cmd
environment-variables
Eric Schoonover
fonte
fonte
Respostas:
Você pode capturar as variáveis de ambiente do sistema com um script vbs, mas é necessário um script bat para alterar as variáveis de ambiente atuais, portanto, essa é uma solução combinada.
Crie um arquivo chamado
resetvars.vbs
contendo esse código e salve-o no caminho:crie outro nome de arquivo resetvars.bat contendo este código, no mesmo local:
Quando você deseja atualizar as variáveis de ambiente, basta executar
resetvars.bat
Apologética :
Os dois principais problemas que tive com esta solução foram:
uma. Não consegui encontrar uma maneira direta de exportar variáveis de ambiente de um script vbs de volta para o prompt de comando e
b. a variável de ambiente PATH é uma concatenação do usuário e das variáveis PATH do sistema.
Não tenho certeza de qual é a regra geral para variáveis conflitantes entre usuário e sistema, portanto optei por substituir o sistema pelo usuário, exceto na variável PATH, que é tratada especificamente.
Eu uso o estranho mecanismo vbs + bat + bat temporário para solucionar o problema de exportar variáveis do vbs.
Nota : este script não exclui variáveis.
Provavelmente isso pode ser melhorado.
ADICIONADO
Se você precisar exportar o ambiente de uma janela de cmd para outra, use este script (vamos chamá-lo
exportvars.vbs
):Execute
exportvars.vbs
na janela que pretende exportar a partir de , em seguida, mudar para a janela que você deseja exportar para , e digite:fonte
Aqui está o que Chocolatey usa.
https://github.com/chocolatey/choco/blob/master/src/chocolatey.resources/redirects/RefreshEnv.cmd
fonte
RefreshEnv
para obter variáveis de ambiente atualizadas na sua sessão atual.Powershell
também? Parece apenas funcionarcmd.exe
para mim.No Windows 7/8/10, você pode instalar o Chocolatey, que possui um script para este built-in.
Depois de instalar o Chocolatey, basta digitar
refreshenv
.fonte
Pelo projeto não há um construído em mecanismo para Windows para propagar um ambiente variável add / Alterar / remover para um cmd.exe já em execução, ou de outro cmd.exe ou a partir de "Meu Computador -> Propriedades -> Configurações avançadas -> Variáveis ambientais".
Se você modificar ou adicionar uma nova variável de ambiente fora do escopo de um prompt de comando aberto existente, será necessário reiniciar o prompt de comando ou adicionar manualmente usando SET no prompt de comando existente.
A resposta aceita mais recente mostra uma solução alternativa, atualizando manualmente todas as variáveis de ambiente em um script. O script lida com o caso de uso de alterar variáveis de ambiente globalmente em "Meu Computador ... Variáveis de Ambiente", mas se uma variável de ambiente for alterada em um cmd.exe, o script não a propagará para outra cmd.exe em execução.
fonte
Me deparei com essa resposta antes de finalmente encontrar uma solução mais fácil.
Basta reiniciar
explorer.exe
no Gerenciador de tarefas.Não testei, mas também pode ser necessário reabrir o prompt de comando.
Crédito para Timo Huovinen aqui: Nó não reconhecido, embora instalado com êxito (se isso ajudou você, dê o crédito de comentário deste homem).
fonte
cmd
janela como Administrador. Use o comandotaskkill /f /im explorer.exe && explorer.exe
. Isso matará o processo explorer.exe e o reiniciará.Isso funciona no Windows 7:
SET PATH=%PATH%;C:\CmdShortcuts
testado digitando echo% PATH% e funcionou, tudo bem. Também defina se você abrir um novo cmd, não haverá mais necessidade de reinicializações traquinas :)
fonte
setx
porque herda o ambiente atual, que pode ter variáveis modificadas e não o que eu quero permanentemente. Fazer dessa maneira me permite evitar reiniciar o console para usar as variáveis, evitando o problema de não tê-las disponíveis globalmente no futuro.Use "setx" e reinicie o prompt do cmd
Existe uma ferramenta de linha de comando denominada " setx " para este trabalho. É para ler e escrever variáveis env. As variáveis persistem após a janela de comando ser fechada.
"Cria ou modifica variáveis de ambiente no ambiente do usuário ou do sistema, sem a necessidade de programação ou script. O comando setx também recupera os valores das chaves do Registro e os grava em arquivos de texto".
Nota: as variáveis criadas ou modificadas por esta ferramenta estarão disponíveis em janelas de comando futuras, mas não na janela de comando atual do CMD.exe. Então, você precisa reiniciar.
Se
setx
estiver faltando:Ou modifique o registro
MSDN diz:
fonte
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\VARIABLE
atual do usuário:HKEY_CURRENT_USER\Environment\VARIABLE
%PATH%
,setx
pode truncar isso para 1024 bytes! E assim, sua noite desapareceuChamar essa função funcionou para mim:
fonte
O melhor método que surgiu foi apenas fazer uma consulta no Registro. Aqui está o meu exemplo.
No meu exemplo, eu fiz uma instalação usando um arquivo em lotes que adicionou novas variáveis de ambiente. Eu precisava fazer isso assim que a instalação fosse concluída, mas não consegui gerar um novo processo com essas novas variáveis. Eu testei gerando outra janela do explorador e liguei novamente para o cmd.exe e isso funcionou, mas no Vista e no Windows 7, o Explorer é executado apenas como uma instância única e normalmente como a pessoa conectada. faça as coisas independentemente da execução no sistema local ou como administrador na caixa. A limitação disso é que ele não lida com coisas como path, isso só funcionou em variáveis de ambiente simples. Isso me permitiu usar um lote para ir para um diretório (com espaços) e copiar arquivos executados .exes e etc. Isso foi escrito hoje a partir de maio de recursos em stackoverflow.com
Lote original chama para novo lote:
testenvget.cmd SDROOT (ou qualquer que seja a variável)
Também existe outro método que surgiu de várias idéias diferentes. Por favor veja abaixo. Isso basicamente obterá a variável de caminho mais recente do registro, no entanto, isso causará vários problemas, pois a consulta do registro fornecerá variáveis por si só, o que significa que em todos os lugares há uma variável que não funcionará, portanto, para combater esse problema, basicamente duplicar o caminho. Muito nojento. O método mais preferido seria: Definir caminho =% Path%; C: \ Arquivos de programas \ Software .... \
Independentemente do novo arquivo em lotes, tenha cuidado.
fonte
A maneira mais fácil de adicionar uma variável ao caminho sem reiniciar a sessão atual é abrir o prompt de comando e digite:
e pressione enter.
para verificar se sua variável foi carregada, digite
e pressione enter. No entanto, a variável fará parte apenas do caminho até a reinicialização.
fonte
É possível fazer isso substituindo a Tabela de ambiente dentro de um processo especificado.
Como prova de conceito, escrevi este aplicativo de exemplo, que acabou de editar uma única variável de ambiente (conhecida) em um processo cmd.exe:
Saída de amostra:
Notas
Essa abordagem também seria limitada a restrições de segurança. Se o destino for executado em uma elevação mais alta ou em uma conta mais alta (como SYSTEM), não teremos permissão para editar sua memória.
Se você quisesse fazer isso em um aplicativo de 32 bits, as compensações codificadas anteriormente mudariam para 0x10 e 0x48, respectivamente. Essas compensações podem ser encontradas despejando as estruturas _PEB e _RTL_USER_PROCESS_PARAMETERS em um depurador (por exemplo, no WinDbg
dt _PEB
edt _RTL_USER_PROCESS_PARAMETERS
)Para alterar a prova de conceito para o que o OP precisa, ele apenas enumera as variáveis atuais do sistema e do ambiente do usuário (como documentadas pela resposta do @ tsadok) e grava a tabela de ambiente inteira na memória do processo de destino.
Editar: o tamanho do bloco de ambiente também é armazenado na estrutura _RTL_USER_PROCESS_PARAMETERS, mas a memória é alocada no heap do processo. Portanto, a partir de um processo externo, não teríamos a capacidade de redimensioná-lo e torná-lo maior. Eu brinquei com o uso do VirtualAllocEx para alocar memória adicional no processo de destino para o armazenamento do ambiente e pude definir e ler uma tabela totalmente nova. Infelizmente, qualquer tentativa de modificar o ambiente de maneira normal falha e queima quando o endereço não aponta mais para o heap (ele trava no RtlSizeHeap).
fonte
As variáveis de ambiente são mantidas em HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet \ Control \ Session Manager \ Environment.
Muitos dos ambientes úteis, como Path, são armazenados como REG_SZ. Existem várias maneiras de acessar o registro, incluindo REGEDIT:
REGEDIT /E <filename> "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment"
A saída começa com números mágicos. Portanto, para pesquisar com o comando find, ele precisa ser digitado e redirecionado:
type <filename> | findstr -c:\"Path\"
Portanto, se você deseja apenas atualizar a variável de caminho na sua sessão de comando atual com as propriedades do sistema, o seguinte script em lote funciona bem:
RefreshPath.cmd:
fonte
Tente abrir um novo prompt de comando como administrador. Isso funcionou para mim no Windows 10. (Eu sei que essa é uma resposta antiga, mas tive que compartilhar isso porque ter que escrever um script VBS apenas por isso é um absurdo).
fonte
A reinicialização do explorer fez isso por mim, mas apenas para novos terminais cmd.
O terminal que eu defini o caminho já pode ver a nova variável Path (no Windows 7).
fonte
A coisa confusa pode ser que existem alguns lugares para começar o cmd. No meu caso, eu executei o cmd no windows explorer e as variáveis de ambiente não mudaram, enquanto ao iniciar o cmd a partir da "execução" (tecla windows + r) as variáveis de ambiente foram alteradas .
No meu caso, eu apenas tive que matar o processo do Windows Explorer do gerenciador de tarefas e depois reiniciá-lo novamente a partir do gerenciador de tarefas .
Depois disso, tive acesso à nova variável de ambiente a partir de um cmd gerado no Windows Explorer.
fonte
Eu uso o seguinte código nos meus scripts em lote:
Usando SET após SETX , é possível usar a variável "local" diretamente, sem reiniciar a janela de comando. E na próxima execução, a variável de ambiente será usada.
fonte
Gostei da abordagem seguida por chocolatey, como publicado na resposta do covarde anônimo, já que é uma abordagem em lote puro. No entanto, ele deixa um arquivo temporário e algumas variáveis temporárias por aí. Eu fiz uma versão mais limpa para mim.
Faça um arquivo
refreshEnv.bat
em algum lugar no seuPATH
. Atualize o ambiente do console executandorefreshEnv
.fonte
Se se trata de apenas um (ou alguns) vars específicos que você deseja alterar, acho que a maneira mais fácil é uma solução alternativa : basta definir no seu ambiente E na sua sessão atual do console
Eu tenho esse script em lote simples para alterar meu Maven de Java7 para Java8 (que são ambos env. Vars). A pasta em lote está na minha PATH var, para que eu possa sempre chamar ' j8 ' e no meu console e no ambiente minha JAVA_HOME var é alterado:
j8.bat:
Até agora, acho isso funcionando melhor e mais fácil. Você provavelmente deseja que este seja um comando, mas simplesmente não existe no Windows ...
fonte
A solução que uso há alguns anos:
Edit: Woops, aqui está a versão atualizada.
fonte
Não existe um caminho reto, como disse Kev. Na maioria dos casos, é mais simples gerar outra caixa CMD. Mais irritantemente, os programas em execução também não estão cientes das mudanças (embora o IIRC possa haver uma mensagem de transmissão a ser observada para ser notificado sobre essa mudança).
Foi pior: nas versões mais antigas do Windows, era necessário fazer logoff e logon novamente para levar em conta as alterações ...
fonte
Eu uso esse script do Powershell para adicionar à variável PATH . Com um pequeno ajuste, também pode funcionar no seu caso.
fonte
Obrigado por postar esta pergunta que é bastante interessante, mesmo em 2019 (De fato, não é fácil renovar o cmd do shell, pois é uma instância única, como mencionado acima), porque a renovação de variáveis de ambiente no Windows permite realizar muitas tarefas de automação sem tendo que reiniciar manualmente a linha de comando.
Por exemplo, usamos isso para permitir que o software seja implantado e configurado em um grande número de máquinas que reinstalamos regularmente. E devo admitir que ter que reiniciar a linha de comando durante a implantação de nosso software seria muito impraticável e exigiria que encontrássemos soluções alternativas que não sejam necessariamente agradáveis. Vamos ao nosso problema. Nós procedemos da seguinte maneira.
1 - Temos um script em lote que, por sua vez, chama um script de PowerShell como este
[arquivo: task.cmd] .
cmd
> powershell.exe -executionpolicy unrestricted -File C:\path_here\refresh.ps1
2 - Depois disso, o script refresh.ps1 renova as variáveis de ambiente usando chaves do Registro (GetValueNames (), etc.). Então, no mesmo script do PowerShell, basta chamar as novas variáveis de ambiente disponíveis. Por exemplo, em um caso típico, se acabamos de instalar o nodeJS antes com o cmd usando comandos silenciosos, depois que a função foi chamada, podemos chamar diretamente o npm para instalar, na mesma sessão, pacotes específicos como a seguir.
[arquivo: refresh.ps1]
Depois que o script do PowerShell termina, o script cmd continua com outras tarefas. Agora, lembre-se de que, após a conclusão da tarefa, o cmd ainda não terá acesso às novas variáveis de ambiente, mesmo que o script do PowerShell tenha atualizado as da sua própria sessão. É por isso que fazemos todas as tarefas necessárias no script do PowerShell, que podem chamar os mesmos comandos que o cmd, é claro.
fonte
Editar: isso só funciona se as alterações no ambiente que você está fazendo resultarem da execução de um arquivo em lotes.
Se um arquivo em lote começar
SETLOCAL
, ele sempre retornará ao seu ambiente original na saída, mesmo se você esquecer de ligarENDLOCAL
antes da saída do lote ou se for interrompido inesperadamente.Quase todos os arquivos em lotes que escrevo começam,
SETLOCAL
pois, na maioria dos casos, não quero que os efeitos colaterais das alterações no ambiente permaneçam. Nos casos em que eu quero que certas alterações de variáveis de ambiente sejam propagadas para fora do arquivo em lotes, minha últimaENDLOCAL
aparência será assim:fonte
Para resolver isso, alterei a variável de ambiente usando BOTH setx e set e reiniciei todas as instâncias do explorer.exe. Dessa forma, qualquer processo iniciado posteriormente terá a nova variável de ambiente.
Meu script em lote para fazer isso:
O problema dessa abordagem é que todas as janelas do explorer que estão abertas no momento serão fechadas, o que provavelmente é uma má idéia - Mas veja o post de Kev para saber por que isso é necessário.
fonte