Las rutas cmd de Windows 7 son diferentes

Las rutas cmd de Windows 7 son diferentes

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 Runel método, la explorer.exeinstancia que maneja su escritorio creará la cmdinstancia, pero cuando usa el Shiftmétodo + clic derecho, una explorerinstancia diferente, hija de svchost.exe(hija de services.exe, hija de wininit.exe) creará la cmdinstancia.

Si ambas versiones del explorador no tienen los mismos bloques de entorno, las cmdinstancias 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_SETTINGCHANGEmensaje a todas las ventanas superiores. La explorerinstancia 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 ProcExpverificando 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_BROADCASTpara enviar el WM_SETTINGCHANGEmensaje, un mensaje directo al proceso del explorador de archivos podría resolverlo (o no)

¿Como lidiar con? Mata la explorerinstancia 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 cmdinstancias verán los cambios.

Editado

Después de algunas pruebas con un monitor de API, he visto que svchost.exeestá creando el explorerproceso mediante una CreateProcessAsUserWllamada de API. En esta llamada, el lpEnvironmentargumento no es nulo (si es nulo, el entorno se copia del padre al hijo), al igual que svchost.exela 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_SETTINGSCHANGEse envíe ningún mensaje, elimino la explorerinstancia del explorador de archivos y creo las dos cmdinstancias. El resultado es

  • RunMétodo: la cmdinstancia 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 del explorer.exeque maneja el escritorio.

  • Shift+Método clic: los cambios en el registro están disponibles.

Entonces, svchost.exese 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.

información relacionada