Я пытаюсь изменить системные пути на моем компьютере.
По какой-то причине, когда я открываю 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.exe
cmd
Если обе версии проводника не имеют одинаковых блоков среды, cmd
экземпляры не будут иметь одинаковых переменных.
При изменении конфигурации переменных окружения в свойствах системы ОС отправит сообщение WM_SETTINGCHANGE
всем верхним окнам. Экземпляр explorer
, обрабатывающий рабочий стол, получит его и обновит свой блок окружения, но экземпляр, обрабатывающий просмотр файлов (тот, что под ), не обрабатывает сообщение (нет, в данный момент я не знаю почему), и его блок окружения не обновляется (все это было проверено с помощью проверки окружений процессов svchost.exe
sysinternal ).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 новым программам, которые он выполняет.