Por que minha variável de ambiente PATH é diferente do prompt de comando?

11

Um pouco de histórico importante: minha empresa possui um script VBS de login genérico que faz modificações na variável de ambiente PATH do usuário no login e me permite executar um software que possui dependências no compartilhamento de arquivos DFS mapeado. Também instalei recentemente o Windows Powershell SDK na minha máquina com Windows 7 Enterprise e tentei modificar minha variável de ambiente PATH na linha de comando do Powershell.

Depois disso, notei que não era mais possível executar aplicativos que correspondam a essas modificações no PATH de logon e que o editor de variáveis ​​de ambiente PATH estava definido como algo diferente do que estava aparecendo quando emitei um 'echo %PATH%'no prompt de comando.

Então, por exemplo (simplificação), no editor de variáveis ​​de ambiente ( My Computer properties -> Advanced System Settings -> Environment Variables) eu tive

 C:\MyDir\; C:\MyOtherDir

enquanto que quando fiz isso 'echo %PATH%'em um prompt de comando, obtive:

 C:\MyDir\

Alguém mais teve um problema semelhante e houve algum tipo de resolução? Quando procurei no Google por ajuda, me deparei com isso:

(Relacionado?) StackOverflow Thread

Ocorreu-me que, se o script de login foi iniciado por algo diferente do meu ambiente Explorer.exe, esse era o problema. No entanto, quando eu executei o script de login, meu PATH no prompt de comando permaneceu inalterado. O que isso teria a ver com o PowerShell? Estou sentindo falta de como isso está conectado a essa instalação completamente.

PatternMatching
fonte
Como você modificou o caminho no PowerShell? Onde você ecoou% PATH%? No cmd.exe?
Werner Henze
A RESPOSTA ABAIXO É GENIUS.
SDsolar 4/17/17

Respostas:

11

O Windows possui duas classes de variáveis ​​de ambiente, variáveis ​​de ambiente do sistema e variáveis ​​de ambiente do usuário . Se você estiver usando echo %PATH%, verá sua variável de ambiente do usuário PATH . Somente se não houver variável de usuário definida, a variável do sistema entrará em vigor para os processos do usuário.

O PATHseparador ;não deve ser seguido por um espaço em branco.

A seguinte observação da Microsoft pode ser útil:

Você pode modificar variáveis ​​de ambiente do usuário editando a seguinte chave do Registro:

   HKEY_CURRENT_USER \ 
         Environment

Você pode modificar as variáveis ​​de ambiente do sistema editando a seguinte chave do Registro:

   HKEY_LOCAL_MACHINE \ 
               SYSTEM \ 
    CurrentControlSet \ 
              Control \ 
      Session Manager \ 
          Environment

Observe que qualquer variável de ambiente que precise ser expandida (por exemplo, quando você usa %SYSTEM%) deve ser armazenada no registro como um REG_EXPAND_SZvalor do registro. Quaisquer valores do tipo REG_SZnão serão expandidos quando lidos do registro.

Observação adicional: sempre que um processo altera seu ambiente (em vez das configurações do registro que definem o ambiente para novos processos), as alterações são visíveis apenas para processos filhos.

Axel Kemper
fonte
1
Gostaria de enfatizar o argumento de Axel, se você precisar modificar as variáveis ​​ambientais, e precisará fazer a alteração no registro. Na verdade, eu criei uma função PowerShell para ajudar com isso: computerperformance.co.uk/powershell/powershell_env_path.htm
Guy Thomas
1
Não há valores a serem modificados, apenas duas variáveis tmpe temp. Você tem certeza de que este é o caminho para o usuário, que deve ser modificado?
Johnny_D
Isso não parece funcionar (antes de uma reinicialização, pelo menos). A variável path não está no HKCU \ Environment, a variável path no cmd.exe é exibida corretamente, mas os aplicativos iniciados ainda estão vendo a variável path antiga.
Martin Argerami
@ Martin: sim, o aplicativo iniciado não reconhece as alterações do registro, porque elas obtêm sua cópia de memória do ambiente durante a inicialização do aplicativo. Essa cópia depende do processo pai que inicia os subprocessos. Se, por exemplo, foram iniciados no Windows Explorer, você teria que reiniciar o Explorer para obter o novo PATH.
Axel Kemper
Você acertou em cheio na cabeça! O Path lá estava adicionando alguns programas que eu sabia que haviam sido removidos, como o Microsoft SQL. Eu sabia que não estava vindo do caminho de propriedades do sistema que eu havia definido. Muito obrigado - no futuro - você postou esta resposta há mais de 3 anos.
SDSolar 04/07/2017