Usuário versus variáveis ​​de ambiente do sistema: as variáveis ​​do sistema substituem as variáveis ​​do usuário?

21

Eu tenho direitos elevados no meu laptop, mas não direitos de administrador. São necessários direitos de administrador para modificar variáveis ​​de ambiente do sistema. Eu esperava que, se eu criasse uma variável de ambiente do usuário com o mesmo nome que uma variável de ambiente do sistema, a variável do usuário substituiria a variável do sistema, mas isso não parece ser o caso.

Depois de adicionar uma variável de usuário com o mesmo nome que uma variável de sistema, abri uma nova janela cmd e usei o comando echo para exibir a variável. Ele me mostrou o valor da variável do sistema em vez do valor da variável do usuário.

Eu só queria confirmar que esse comportamento é esperado e entender o raciocínio por trás dele. Eu esperaria que a configuração mais específica do usuário substituísse a do sistema.

Eu tenho o Windows 7.

Chade
fonte
Quando você altera as variáveis, geralmente precisa reiniciar completamente o Windows. Alterar uma variável nas configurações não altera os processos em execução. Novos processos copiam o ambiente dos processos em execução (dependendo de como eles são iniciados); portanto, simplesmente iniciar um processo não significa que você obtenha um novo ambiente.
Zoredache
Reiniciei e ainda assim, quando executo "echo% path%" em uma janela do cmd.exe, ele exibe a variável de ambiente do sistema, não o valor da variável de usuário. Portanto, excluí a variável Usuário, o acesso de administrador, alterei a variável de caminho do sistema e o mesmo cmd de eco. O valor do env atualizado foi exibido sem a reinicialização. Isso me diz que os vars do USUÁRIO não substituem os vars do sistema e que uma reinicialização não é necessária. Neitehr é o que eu esperava.
Chad
Qual procedimento usado para adicionar uma variável de usuário com o mesmo nome que uma variável de sistema ? Algo como ?
JosefZ
JosefZ: sim, eu adicionei as duas variáveis ​​de ambiente, um USUÁRIO e outro SYSTEM, ambos com o mesmo nome, usando a GUI do Windows 7 semelhante às telas mostradas no seu link.
Chad
@ Chade A resposta que você aceitou abaixo não é exatamente o oposto de sua experiência? Como você explica a discrepância?
RockPaperLizard

Respostas:

25

De acordo com o artigo MSKB Variáveis ​​de ambiente no Windows NT :

Variáveis ​​de ambiente do usuário .... têm precedência sobre variáveis ​​de ambiente do sistema.

Uma exceção notável é a PATHvariável que é um resultado combinado das variáveis ​​do sistema e do usuário:

O caminho é construído a partir do caminho do sistema, que pode ser visualizado no campo Variáveis ​​de ambiente do sistema na caixa de diálogo Sistema. O caminho do usuário é anexado ao caminho do sistema.

O artigo também discute exceções idênticas para a expansão das variáveis LibPathe Os2LibPath, além de como autoexec.batsão tratadas as especificadas em . Esses pontos provavelmente encontrarão pouca relevância nos ambientes típicos de hoje.

Crédito para esta resposta SO

Eu digo Restabelecer Monica
fonte
2
É possível tornar o caminho do usuário precedendo o caminho do sistema?
Qwerty
3

Tudo o que o Twisty Impersonator disse em sua resposta está correto. A ideia de que a variável de caminho do usuário está anexada foi destacada e acredito que as consequências dessa diferença requerem algum tratamento adicional.

Caminho =% Caminho% (Sistema); % Path% (Usuário)

Quando você executar um programa executável (ou qualquer script executável, como .bat, .vbs, etc.) você não precisa fornecer o caminho totalmente qualificado.

Por exemplo, para executar java, você pode digitar qualquer um destes:

C:/Program Files (x86)/Java/jre6/bin/java -version

java.exe -version

java -version

O primeiro exemplo usa um caminho completo. Isso sempre usará a versão do Java nesse caminho exato.

O segundo exemplo examinará cada um dos diretórios da %Path%variável de ambiente, procurando um arquivo executável chamado java.exe. Ele executará o primeiro encontrado e interromperá a pesquisa. Se houver dois arquivos nomeados java.exeem algum lugar no %Path%, apenas o primeiro encontrado será usado.

O terceiro exemplo, como o segundo, irá percorrer os diretórios listados em %Path%. Além disso, como uma extensão de arquivo não foi fornecida, uma lista de extensões de arquivo executáveis ​​é anexada ao nome do arquivo, na ordem especificada na %PATHEXT%variável de ambiente. Se houver vários arquivos nomeados java.com, java.exe, java.bat, etc. em algum lugar no %Path%, apenas o primeiro encontrado é usado.

Você pode ver a lista de extensões de caminho executável em seu sistema, criando o seguinte arquivo em lotes:

@echo off
echo %PATHEXT%
pause

Na minha máquina, são eles:

.COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS; .JSE; .WSF; .WSH; .MSC; .PY

O que tudo isso significa?

Dentro forte contraste com outras variáveis ​​de ambiente, o caminho do usuário não permite substituir o caminho do sistema. O oposto exato é o caso. Dos exemplos acima, existem muitos casos em que você pode alterar a versão padrão do Java. No entanto, se já existe uma versão Java listada no caminho do sistema, essa é a versão que SEMPRE será encontrada primeiro, porque o caminho é pesquisado na ordem, da esquerda para a direita, e o caminho do usuário é anexado à direita lado esquerdo, com o caminho do sistema à esquerda.

O que posso fazer sobre isso?

Se você não tiver acesso às variáveis ​​de ambiente do sistema, não poderá substituir os programas padrão no caminho do sistema usando o caminho do usuário. (De fato, deve ser assim, ou certos programas parariam de funcionar corretamente e abririam seu sistema a adulteração de software malicioso. Ninguém quer isso.)

Em vez disso, você deve usar um caminho completo se precisar usar uma versão específica.

JonathanDavidArndt
fonte
1
É possível tornar o caminho do usuário precedendo o caminho do sistema?
Qwerty
1
Esse seria um bom tópico para uma pergunta diferente. (Uma pesquisa rápida neste site não revelou nada imediatamente relevante.) Por favor, sinta-se à vontade para fazer uma nova pergunta e poste um link para ela aqui nos comentários!
JonathanDavidArndt