Os caminhos do cmd do Windows 7 são diferentes

Os caminhos do cmd do Windows 7 são diferentes

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 Runo método, a explorer.exeinstância que manipula sua área de trabalho criará a cmdinstância, mas quando você usar o Shiftmétodo + clique com o botão direito, uma explorerinstância diferente, filho de svchost.exe(filho de services.exe, filho de wininit.exe) criará a cmdinstância.

Se ambas as versões do Explorer não possuírem os mesmos blocos de ambiente, as cmdinstâ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_SETTINGCHANGEmensagem para todas as janelas principais. A explorerinstâ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 ProcExpverificando 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_BROADCASTpara enviar a WM_SETTINGCHANGEmensagem, uma mensagem direta ao processo do navegador de arquivos possa resolver (ou não)

Como lidar com isso? Elimine a explorerinstâ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 cmdinstâncias verão as alterações.

Editado

Após alguns testes com um monitor de API, vi que svchost.exeestá criando o explorerprocesso por meio de uma CreateProcessAsUserWchamada de API. Nesta chamada, o lpEnvironmentargumento não é nulo (se for nulo, o ambiente é copiado de pai para filho), assim como svchost.exea 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_SETTINGSCHANGEmensagem seja enviada, eliminei a explorerinstância do navegador de arquivos e criei as duas cmdinstâncias. O resultado é

  • Runmétodo: a cmdinstâ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 daquele explorer.exeque cuida do desktop.

  • ShiftMétodo +Click: as alterações no registro estão disponíveis.

Então, svchost.exeestá 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.

informação relacionada