Por que minha linha de comando do Windows 8 não atualiza seu caminho

21

Eu precisava adicionar uma nova entrada à minha variável PATH. Essa é uma atividade comum para mim no meu trabalho, mas recentemente comecei a usar o Windows 8. Presumi que o processo seria semelhante ao Windows 7, Vista, XP ...

Aqui está a minha sequência de eventos:

  1. Abra Propriedades do sistema (Iniciar-> [tipo "Painel de controle"] -> Painel de controle \ Sistema e segurança \ Sistema -> Configurações avançadas do sistema -> Variáveis ​​de ambiente)
  2. Adicione o novo caminho ao início da minha variável USER PATH (C: \ dev \ Java \ apache-ant-1.8.4 \ bin;)
  3. Abriu um prompt de comando (Iniciar -> [digite "prompt de comando" digite] -> [digite "caminho" digite]

Minha nova entrada de caminho não está disponível (consulte a imagem e o vídeo em anexo). Dupliquei exatamente o mesmo processo em uma máquina Windows 7 e funcionou.

Captura de tela de variáveis ​​de ambiente

EDITAR

Vídeo sobre variáveis ​​de ambiente e prompt de comando do Windows 8

EDITAR

Definitivamente, esse não é o comportamento do Windows 7. Assista a este vídeo para ver o comportamento que espero trabalhar no Windows 7. http://youtu.be/95JXY5X0fII

EDIT 31/05/2013

Então, depois de muita frustração, escrevi um pequeno aplicativo C # para testar o WM_SETTINGCHANGEevento. Esse código recebe o evento no Windows 7 e no Windows 8. No entanto, no Windows 8 do meu sistema, não obtenho o caminho correto; mas eu faço no Windows 7. Isso não pôde ser reproduzido em outros sistemas Windows 8.

Aqui está o código C #.

using System;
using Microsoft.Win32;

public sealed class App
{
    static void Main()
    {
        SystemEvents.UserPreferenceChanging += new UserPreferenceChangingEventHandler(OnUserPreferenceChanging);

        Console.WriteLine("Waiting for system events.");
        Console.WriteLine("Press <Enter> to exit.");
        Console.ReadLine();
    }

    static void OnUserPreferenceChanging(object sender, UserPreferenceChangingEventArgs e)
    {
        Console.WriteLine("The user preference is changing. Category={0}", e.Category);
        Console.WriteLine("path={0}", System.Environment.GetEnvironmentVariable("PATH"));
    }
}

OnUserPreferenceChanging é equivalente a WM_SETTINGCHANGE

Programa C # em execução no Windows 7 (você pode ver o evento acontecer e ele escolhe o caminho correto).

Programa C # em execução no Windows 8 (você pode ver o evento acontecer, mas o caminho errado).

Há algo no meu ambiente que está precipitando esse problema. No entanto, isso é um bug do Windows 8?

EDIT 2014-04-28

Devido a esse e vários outros problemas, não usamos mais o Windows 8 na área de trabalho. Não temos um ambiente para continuar testando e experimentando esse problema. Ainda não há resposta ou solução para esse problema. As respostas abaixo não resolveram o nosso problema.

mawcsco
fonte
2
Eu acho que você precisa reiniciar depois de fazer as alterações para que tenham efeito.
Enigma
@Enigma Por quê? Eu não tinha necessidade de reinicialização no Windows 7, Vista, XP, 2000 ...
mawcsco
@mawcsco Você fez em 7, pelo menos. A abertura de prompts de comando no menu Iniciar é iniciada com o ambiente a partir do shell do Explorer, que foi carregado quando você efetuou login. Você precisa matar / reiniciar o Explorer, efetuar logout ou logon novamente ou reiniciar o sistema.
Darth Android
1
@ Enigma Não é necessário reiniciar. serverfault.com/questions/8855/…
mawcsco
1
Acabei de verificar isso no Windows 7 e no Windows 8: nos dois casos, a nova variável de ambiente estava visível cmdquando uma nova instância foi lançada. É claro que o já em execução cmdnão recebeu o ambiente atualizado.
Alexey Ivanov

Respostas:

7

Se você estiver iniciando o prompt de comando no menu Iniciar ou um atalho na barra de tarefas, deverá:

  • Reinicie explorer. Mate-o e reinicie-o.
  • Efetue logout e logon novamente (que é reiniciado de maneira eficaz explorer).
  • Reinicie o sistema (que também reinicia efetivamente explorer).

O ambiente não é atualizado imediatamente porque os ambientes são herdados do processo pai, com exceção de explorer, que é iniciado pelo sistema no login. É assim que se comporta no meu sistema Windows 7.

Portanto, alterar as variáveis ​​de ambiente atualiza as chaves do registro, mas essas chaves não são relidas até que o sistema precise criar um novo ambiente de login para o início de um processo. Na maioria das vezes, isso não está acontecendo porque os processos são filhos de um processo que já possui um ambiente e, portanto, o ambiente é herdado.

Darth Android
fonte
2
Absolutamente falso para o Windows 7. Veja o vídeo que eu vinculei no meu post acima.
Mawcsco #
1
Hã. Você está definitivamente correto por lá, apesar de minhas alterações não se aplicarem imediatamente às novas janelas do console no Win 7 antes. Não me lembro qual era meu fluxo de trabalho exato. Vou brincar com meu sistema Win 8 quando chegar em casa se ninguém tiver uma resposta para você até lá.
Darth Android
5
Se você alterou variáveis ​​de ambiente usando a caixa de diálogo Propriedades do sistema, as alterações são aplicadas imediatamente à instância do Explorer em execução no momento e todos os processos iniciados posteriormente obtêm o novo ambiente. Os processos em execução não atualizam automaticamente suas variáveis ​​de ambiente, a menos que tratem de WM_SETTINGCHANGEmensagens.
Alexey Ivanov
1
Cara, isso me ajudou a entender o problema que eu estava tendo de qualquer maneira. Eu uso o AutoHotkey para iniciar um prompt de comando e ele não estava funcionando até que eu reiniciei o autohotkey!
Moss
1
@mawcsco Ela trabalhou para mim, eu estou usando o Windows 7.
laike9m
3

De: http://support.microsoft.com/kb/104011 via /server//q/8855/158027

...

No entanto, observe que as modificações nas variáveis ​​de ambiente não resultam em alterações imediatas. Por exemplo, se você iniciar outro prompt de comando após fazer as alterações, as variáveis ​​de ambiente refletirão os valores anteriores (não os atuais). As alterações não surtirão efeito até você fazer logoff e logon novamente.

Para efetuar essas alterações sem precisar fazer logoff, transmita uma mensagem WM_SETTINGCHANGE para todas as janelas do sistema, para que qualquer aplicativo interessado (como Windows Explorer, Gerenciador de Programas, Gerenciador de Tarefas, Painel de Controle etc.) possa executar uma atualização. MAIS INFORMAÇÕES


Por exemplo, em sistemas baseados no Windows NT, o seguinte fragmento de código deve propagar as alterações nas variáveis ​​de ambiente usadas no prompt de comando:

SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
    (LPARAM) "Environment", SMTO_ABORTIFHUNG,
    5000, &dwReturnValue);

Nenhum dos aplicativos fornecidos com o Windows 95 e Windows 98, incluindo o Windows Explorer e o Gerenciador de Programas, responde a esta mensagem. Portanto, embora este artigo possa ser tecnicamente implementado no Windows 95 e Windows 98, não há efeito, exceto para notificar aplicativos de terceiros. O único método de alterar variáveis ​​de ambiente global no Windows 95 é modificar o arquivo autoexec.bat e reiniciar.

Enigma
fonte
2
O Windows Explorer no Windows 7 lida com essa mensagem e basta reiniciar o prompt de comando na barra de tarefas ou no menu Iniciar.
Alexey Ivanov
"Alterações nas variáveis ​​de ambiente devem entrar em vigor imediatamente, se você fizer a alteração na caixa de diálogo Propriedades principal do computador em questão (vá para Meu Computador | Propriedades | Avançadas | Variáveis ​​de Ambiente). Depois que as alterações são salvas, o Explorer transmite uma mensagem WM_SETTINGCHANGE a todas as janelas para informá-los da alteração ". serverfault.com/questions/8855/…
mawcsco
2
"Dica do sistema Este artigo se aplica a uma versão diferente do Windows que você está usando. O conteúdo deste artigo pode não ser relevante para você. Visite o Windows 8 Solution Center"
mawcsco
Não me surpreenderia que esse seja um detalhe da implementação e que a Microsoft não tinha intenção de dar suporte a esse comportamento no Windows 8 ou superior.
surfasb
1

O problema está na sua configuração do usuário. Na janela 8, cada usuário possui suas próprias variáveis ​​de ambiente.

Abra Propriedades do sistema (Iniciar-> [tipo "Painel de controle"] -> Painel de controle \ Sistema e segurança \ Sistema -> Configurações avançadas do sistema -> Variáveis ​​de ambiente)

A abordagem acima editará variáveis ​​de ambiente para o usuário root, talvez não para o usuário atual.

Você deve ir para a conta de usuário -> selecione sua conta atual -> alterar variáveis ​​de ambiente

Após a alteração, reinicie o power shell. Então

echo $env:JAVA_HOME

ou

Get-ChildItem env

Espero que isso ajude você.

Vu Gia Truong
fonte
Eu acho que você pode ter perdido os detalhes nas minhas capturas de tela e vídeo que mostra a caixa de diálogo com "Variáveis ​​de usuário para mwillia3". Esse é o meu nome de usuário. Sei com certeza que estava editando as variáveis ​​de ambiente corretas. O aplicativo C # dispara o evento, com o valor antigo, não o valor atualizado. Eu desisto. Estou bastante certo de que este é um bug do Win 8 e não tenho mais acesso ao Windows 8 para testar isso.
mawcsco
Algumas pessoas nem sempre leem os detalhes. Vejo isso em alguns sistemas e não em outros, até no Windows 7/2008. Não há rima ou razão para quando eu encontrar.
ferventcoder
Mesmo problema com o Windows Server 2012 r2, mesmo após a propagação de WM_SETTINGSCHANGED. Eu acredito que é um bug do Windows.
vezenkov 28/03
0

Tente SETX em vez de SET. Por exemploSETX PATH "%PATH%;MyPath"

kct
fonte
1
Você pode explicar o porquê, em SETX vez de SETfuncionar.
21420 ChrisF
Primeiro, eu não estava usando a linha de comando, estava usando a caixa de diálogo do sistema. Segundo, meu padrão de comportamento funciona bem no Windows 7, mas às vezes não no Windows 8. Você pode apontar para uma documentação que mostra como SET e SETX mudaram entre o Windows 7 e o Windows 8?
Mawcsco #
0

Se você estiver usando o Windows 8.1, abra o prompt de comando como Administrador, chame o comando PATH e deverá aparecer lá. Quando você voltar ao cmd normal, ele também será exibido. De fato, você deve conseguir iniciar o aplicativo adicionado no prompt de comando.

viktorkh
fonte
-1

Funciona se você usar o Win + R na área de trabalho para iniciar o cmd.exe? Meu palpite é que iniciá-lo na tela inicial faz com que o pai do cmd.exe seja diferente do explorer.exe (WSAHost.exe, IIRC ou qualquer que seja o nome), e esse processo pai não atualiza seu ambiente durante as mensagens WM_SETTINGCHANGE. Não tenho uma máquina Windows 8 disponível para testar ...

user348438
fonte
Mesmo no Windows 8, a interface do usuário da tela inicial parece fazer parte do explorer.exe porque desaparece quando o explorer.exe é morto.
binki