
Estou tentando alterar os caminhos do sistema no meu computador.
Por alguma razão, quando abro o cmd via run, meus caminhos estão corretos conforme o esperado.
No entanto, quando eu Shift + clique com o botão direito em um diretório + abro a janela cmd aqui, recebo um caminho antigo/diferente que nem aparece na variável Path em USER ou SYSTEM.
Exemplo:
CMD de EXECUTAR:
C:\Users\PERSON>python
Python 2.7.7 (default, Jun 1 2014, 14:17:13) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
C:\Users\PERSON>pip
Usage:
pip <command> [options]
CMD de shift + clique direito:
C:\Users\PERSON>python
'python' is not recognized as an internal or external command,
operable program or batch file.
C:\Users\PERSON>pip
'pip' is not recognized as an internal or external command,
operable program or batch file.
Alterei os caminhos do Sistema e do Usuário para ver se houve algum problema estranho, mas o problema persiste.
Se precisares de mais informação avisa-me.
Editar: reiniciei todos os prompts de comando entre as alterações no caminho.
Edição 2: Aqui estão os caminhos
CMD de EXECUTAR:
C:\Users\PERSON>echo %path%
C:\ProgramData\Oracle\Java\javapath;
C:\Windows\system32;
C:\Windows;
C:\Windows\System32\Wbem;
C:\Windows\System32\WindowsPowerShell\v1.0\;
C:\EASE\Cygwin\Bin;
C:\bin;
C:\bin\Hardware;
C:\bin\OpenCV;
C:\bin\Qt;
C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;
C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin;
C:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\Bin;
C:\Python27\;
C:\Python27\Scripts;
C:\Program Files (x86)\Skype\Phone\;
C:\Program Files\SlikSvn\bin;
C:\Program Files (x86)\GNU Tools ARM Embedded\4.7 2012q4\bin;
CMD de shift + clique direito:
C:\Users\PERSON\Desktop>echo %path%
C:\ProgramData\Oracle\Java\javapath;
C:\Windows\system32;
C:\Windows;
C:\Windows\System32\Wbem;
C:\Windows\System32\WindowsPowerShell\v1.0\;
C:\bin;
C:\bin\Hardware;
C:\bin\OpenCV;
C:\bin\Qt;
C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;
C:\Program Files (x86)\Microsoft Visual Studio\VC98\Bin;
C:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\Bin;
C:\Program Files (x86)\Skype\Phone\;
C:\Program Files (x86)\GNU ToolsARM Embedded\4.7 2012q4\bin;
Responder1
Quando um processo é iniciado,por padrãoas variáveis de ambiente sãocopiadodo processo pai (quem está fazendo a solicitação para criar o novo processo) para o processo recém-criado.
Quando você usa Run
o método, a explorer.exe
instância que manipula sua área de trabalho criará a cmd
instância, mas quando você usar o Shiftmétodo + clique com o botão direito, uma explorer
instância diferente, filho de svchost.exe
(filho de services.exe
, filho de wininit.exe
) criará a cmd
instância.
Se ambas as versões do Explorer não possuírem os mesmos blocos de ambiente, as cmd
instâncias não terão as mesmas variáveis.
Quando a configuração das variáveis de ambiente for alterada nas propriedades do sistema, o sistema operacional enviará uma WM_SETTINGCHANGE
mensagem para todas as janelas principais. A explorer
instância que cuida do desktop irá recebê-la e atualizar seu bloco de ambiente, mas a instância que cuida da navegação de arquivos (aquela em svchost.exe
) não processa a mensagem (não, neste momento não sei por que) e seu bloco de ambiente não é atualizado (tudo isso foi testado com sysinternal ProcExp
verificando os ambientes de processos).
Como resolver? Não sei. Talvez (não, não testei, não tenho um compilador em mãos agora, apenas uma ideia) em vez de usar um HWND_BROADCAST
para enviar a WM_SETTINGCHANGE
mensagem, uma mensagem direta ao processo do navegador de arquivos possa resolver (ou não)
Como lidar com isso? Elimine a explorer
instância cujo processo pai é svchost.exe
. Quando um novo navegador de arquivos é solicitado, uma nova instância é iniciada com o bloco de ambiente correto.
Para uma abordagem aproximada, apenas para tentar, execute a partir da linha de comando
wmic process where "name='explorer.exe' and CommandLine like '%/factory%'" call Terminate
para matar o navegador de arquivos. Quando um novo navegador de arquivos for solicitado um novo processo será criado (agora com o ambiente atualizado) e novas cmd
instâncias verão as alterações.
Editado
Após alguns testes com um monitor de API, vi que svchost.exe
está criando o explorer
processo por meio de uma CreateProcessAsUserW
chamada de API. Nesta chamada, o lpEnvironment
argumento não é nulo (se for nulo, o ambiente é copiado de pai para filho), assim como svchost.exe
a criação do ambiente para o novo processo. Mas, qual fonte está sendo usada para criar o novo ambiente?
Então, altero diretamente a variável no registro ( regedit
) para garantir que nenhuma WM_SETTINGSCHANGE
mensagem seja enviada, eliminei a explorer
instância do navegador de arquivos e criei as duas cmd
instâncias. O resultado é
Run
método: acmd
instância não vê as alterações. Como não houve nenhuma mensagem para o pai, seu ambiente não foi alterado e o novo processo iniciado herda a versão inalterada daqueleexplorer.exe
que cuida do desktop.ShiftMétodo +Click: as alterações no registro estão disponíveis.
Então, svchost.exe
está recuperando as informações do registro para criar um bloco de ambiente para passar para o processo recém-criado.
Responder2
Depois de alterar o caminho, você precisa ter certeza dereinicie o Exploradorantes de tentar abrir todos os seus terminais novamente. Dessa forma, o processo Explorer recebe o novo PATH e é capaz de transmitir esse novo PATH para os novos programas que executa.