Os caminhos do Windows 7 cmd são diferentes

2

Estou tentando alterar os caminhos do sistema no meu computador.

Por algum motivo, quando abro cmd via executar meus caminhos estão corretos como esperado.

No entanto, quando eu Shift + Right Clique em um diretório + abra a janela cmd aqui eu recebo um caminho antigo / diferente que nem sequer aparece na variável Path em nenhum usuário ou sistema.

Exemplo:

CMD de RUN:

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 do turno + 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 no Sistema e no Usuário para ver se houve algum problema estranho, mas o problema persiste.

Se precisar de mais alguma informação, avise-me.

Editar: reiniciei todos os prompts de comando entre as alterações no caminho.

Editar 2: aqui estão os caminhos

CMD de RUN:

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 Server0\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.7 2012q4\bin;

CMD do turno + 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 Server0\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.7 2012q4\bin;
    
por Snhp9 19.05.2015 / 01:15

2 respostas

1

Quando um processo é iniciado, por padrão as variáveis de ambiente são copiadas do processo pai (que está fazendo a solicitação para criar o novo processo) para o recém criado processo.

Quando você usa o método Run , a instância de explorer.exe manipulando sua área de trabalho criará a instância cmd , mas quando você usar o método de Shift + clique direito, um% diferente explorer Por exemplo, filho de svchost.exe (filho de services.exe , filho de wininit.exe ) criará a instância cmd .

Se as duas versões do explorador não tiverem os mesmos blocos de ambiente, as instâncias de cmd não terão as mesmas variáveis.

Quando a configuração das variáveis de ambiente é alterada das propriedades do sistema, o sistema operacional enviará uma mensagem WM_SETTINGCHANGE para todas as janelas superiores. A instância explorer que manipula a área de trabalho a receberá e atualizará seu bloco de ambiente, mas a instância que está manipulando a navegação de arquivo (a que está sob svchost.exe ) não processa a mensagem (não, neste momento não sei por quê) e seu bloco de ambiente não é atualizado (tudo isso foi testado com ProcExp do sysinternal verificando os ambientes de processos).

Como resolver? Eu não sei. Talvez (não, não testado, eu não tenho um compilador disponível agora, apenas uma ideia) em vez de usar um HWND_BROADCAST para enviar a mensagem WM_SETTINGCHANGE , uma mensagem direta para o processo do navegador de arquivos poderia resolvê-lo (ou não)

Como lidar com isso? Elimine a instância explorer 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 executar 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 é solicitado, um novo processo será criado (agora com o ambiente atualizado) e as novas instâncias de cmd verão as alterações.

Editado

Depois de alguns testes com um monitor de API, vi que o svchost.exe está criando o processo explorer por meio de uma chamada CreateProcessAsUserW api. Nessa chamada, o argumento lpEnvironment não é nulo (se for nulo, o ambiente é copiado de pai para filho), portanto, svchost.exe está criando o ambiente para o novo processo. Mas qual fonte está sendo usada para criar o novo ambiente?

Portanto, altero diretamente a variável no registro ( regedit ) para garantir que nenhuma mensagem WM_SETTINGSCHANGE seja enviada, anule o navegador de arquivos explorer instance e crie as duas cmd instances. O resultado é

  • Run method: a instância cmd não vê as alterações. Como não havia nenhuma mensagem para o pai, seu ambiente não foi alterado e o novo processo iniciado herda a versão inalterada do explorer.exe que manipula a área de trabalho.

  • Shift + Método de clique: as alterações no registro estão disponíveis.

Portanto, svchost.exe está recuperando as informações do registro para criar um bloco de ambiente para passar para o processo recém-criado.

    
por 20.05.2015 / 14:21
2

Depois de alterar o caminho, você precisa certificar-se de reiniciar o Explorer antes de tentar abrir todos os seus terminais novamente . Dessa forma, o processo Explorer leva o novo PATH e é capaz de transmitir esse novo PATH para novos programas que ele executa.

    
por 19.05.2015 / 03:08