Пути cmd в Windows 7 отличаются

Пути cmd в Windows 7 отличаются

Я пытаюсь изменить системные пути на моем компьютере.

По какой-то причине, когда я открываю cmd через «Выполнить», мои пути верны, как и ожидалось.

Однако когда я нажимаю Shift+правую кнопку мыши в каталоге и открываю окно cmd, я получаю старый/другой путь, который даже не отображается в переменной Path ни в USER, ни в SYSTEM.

Пример:

CMD из 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 из shift+правый клик:

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.

Я изменил пути в System и User, чтобы проверить, нет ли там какой-нибудь странной проблемы, но проблема осталась.

Если вам понадобится дополнительная информация, дайте мне знать.

Редактировать: Я перезапустил все командные строки между изменениями пути.

Редактировать 2: Вот пути

CMD из 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 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 из shift+правый клик:

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;

решение1

Когда процесс запущен,по умолчаниюпеременные средыскопированоот родительского процесса (который делает запрос на создание нового процесса) к вновь созданному процессу.

При использовании Runметода экземпляр, explorer.exeобрабатывающий ваш рабочий стол, создаст cmdэкземпляр, но при использовании метода +щелчка правой кнопкой мыши экземпляр создаст Shiftдругой explorerэкземпляр, дочерний элемент svchost.exe(дочерний элемент services.exe, дочерний элемент ) .wininit.execmd

Если обе версии проводника не имеют одинаковых блоков среды, cmdэкземпляры не будут иметь одинаковых переменных.

При изменении конфигурации переменных окружения в свойствах системы ОС отправит сообщение WM_SETTINGCHANGEвсем верхним окнам. Экземпляр explorer, обрабатывающий рабочий стол, получит его и обновит свой блок окружения, но экземпляр, обрабатывающий просмотр файлов (тот, что под ), не обрабатывает сообщение (нет, в данный момент я не знаю почему), и его блок окружения не обновляется (все это было проверено с помощью проверки окружений процессов svchost.exesysinternal ).ProcExp

Как решить? Не знаю. Может быть (нет, не проверял, компилятора сейчас нет под рукой, просто идея) вместо использования HWND_BROADCASTдля отправки WM_SETTINGCHANGEсообщения, прямое сообщение процессу обозревателя файлов могло бы решить эту проблему (или нет)

Как с этим бороться? Убить explorerэкземпляр, родительский процесс которого svchost.exe. При запросе нового браузера файлов запускается новый экземпляр с правильным блоком окружения.

Для грубого подхода, просто чтобы попробовать, запустите из командной строки

wmic process where "name='explorer.exe' and CommandLine like '%/factory%'" call Terminate

для завершения работы файлового браузера. При запросе нового файлового браузера будет создан новый процесс (теперь с обновленной средой), и новые cmdэкземпляры увидят изменения.

Отредактировано

После нескольких тестов с api monitor я увидел, что svchost.exeсоздает explorerпроцесс через CreateProcessAsUserWвызов api. В этом вызове lpEnvironmentаргумент не равен null (если он равен null, среда копируется из родительского процесса в дочерний), поэтому svchost.exeсоздается среда для нового процесса. Но какой источник используется для создания новой среды?

Итак, я напрямую изменяю переменную в реестре ( regedit), чтобы гарантировать, что WM_SETTINGSCHANGEсообщение не будет отправлено, убиваю экземпляр обозревателя файлов explorerи создаю два cmdэкземпляра. Результат:

  • Runметод: cmdэкземпляр не видит изменений. Поскольку не было никакого сообщения родителю, его среда не была изменена, и новый запущенный процесс наследует неизмененную версию от , explorer.exeкоторый обрабатывает рабочий стол.

  • Shift+Метод клика: изменения в реестре доступны.

Итак, svchost.exeизвлекается информация из реестра для создания блока среды для передачи вновь созданному процессу.

решение2

После того, как вы измените путь, вам необходимо убедиться, чтоперезапустить проводникпрежде чем пытаться снова открыть все ваши терминалы. Таким образом, процесс Explorer принимает новый PATH и может передавать этот новый PATH новым программам, которые он выполняет.

Связанный контент