
Estoy intentando cambiar las rutas del sistema en mi computadora.
Por alguna razón, cuando abro cmd mediante ejecución, mis rutas son correctas como se esperaba.
Sin embargo, cuando hago Mayús + clic derecho en un directorio + abro la ventana cmd aquí, obtengo una ruta antigua/diferente que ni siquiera se muestra en la variable Ruta ni en USUARIO ni en SISTEMA.
Ejemplo:
CMD de EJECUTAR:
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 desde mayús+clic derecho:
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.
Cambié las rutas tanto en Sistema como en Usuario para ver si había algún problema extraño allí, pero el problema persiste.
Si necesita más información, hágamelo saber.
Editar: he reiniciado todos los símbolos del sistema entre cambios en la ruta.
Edición 2: aquí están los caminos
CMD de EJECUTAR:
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 desde mayús+clic derecho:
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;
Respuesta1
Cuando se inicia un proceso,por defectolas variables de entorno soncopiadodesde el proceso principal (que realiza la solicitud para crear el nuevo proceso) hasta el proceso recién creado.
Cuando usa Run
el método, la explorer.exe
instancia que maneja su escritorio creará la cmd
instancia, pero cuando usa el Shiftmétodo + clic derecho, una explorer
instancia diferente, hija de svchost.exe
(hija de services.exe
, hija de wininit.exe
) creará la cmd
instancia.
Si ambas versiones del explorador no tienen los mismos bloques de entorno, las cmd
instancias no tendrán las mismas variables.
Cuando se cambia la configuración de las variables de entorno desde las propiedades del sistema, el sistema operativo enviará un WM_SETTINGCHANGE
mensaje a todas las ventanas superiores. La explorer
instancia que maneja el escritorio lo recibirá y actualizará su bloque de entorno, pero la instancia que maneja la exploración de archivos (la que está debajo svchost.exe
) no procesa el mensaje (no, en este momento no sé por qué) y su bloque de entorno no actualizado (todo esto ha sido probado con sysinternal's ProcExp
verificando los entornos de procesos).
¿Cómo resolver? No sé. Quizás (no, no probado, no tengo un compilador a mano ahora, solo una idea) en lugar de usar a HWND_BROADCAST
para enviar el WM_SETTINGCHANGE
mensaje, un mensaje directo al proceso del explorador de archivos podría resolverlo (o no)
¿Como lidiar con? Mata la explorer
instancia cuyo proceso padre es svchost.exe
. Cuando se solicita un nuevo explorador de archivos, se inicia una nueva instancia con el bloque de entorno correcto.
Para un enfoque aproximado, solo para intentarlo, ejecute desde la línea de comando
wmic process where "name='explorer.exe' and CommandLine like '%/factory%'" call Terminate
para cerrar el explorador de archivos. Cuando se solicita un nuevo explorador de archivos, se creará un nuevo proceso (ahora con el entorno actualizado) y las nuevas cmd
instancias verán los cambios.
Editado
Después de algunas pruebas con un monitor de API, he visto que svchost.exe
está creando el explorer
proceso mediante una CreateProcessAsUserW
llamada de API. En esta llamada, el lpEnvironment
argumento no es nulo (si es nulo, el entorno se copia del padre al hijo), al igual que svchost.exe
la creación del entorno para el nuevo proceso. Pero, ¿qué fuente se está utilizando para crear el nuevo entorno?
Entonces, cambio directamente la variable en el registro ( regedit
) para asegurarme de que no WM_SETTINGSCHANGE
se envíe ningún mensaje, elimino la explorer
instancia del explorador de archivos y creo las dos cmd
instancias. El resultado es
Run
Método: lacmd
instancia no ve los cambios. Como no hubo ningún mensaje para el padre, su entorno no se cambió y el nuevo proceso iniciado hereda la versión sin cambios delexplorer.exe
que maneja el escritorio.Shift+Método clic: los cambios en el registro están disponibles.
Entonces, svchost.exe
se recupera la información del registro para crear un bloque de entorno para pasar al proceso recién creado.
Respuesta2
Después de cambiar la ruta, debe asegurarse dereiniciar el Exploradorantes de intentar abrir todos sus terminales nuevamente. De esta manera, el proceso Explorer toma la nueva RUTA y puede transmitir esa nueva RUTA a los nuevos programas que ejecuta.