Windows 7 cmd 경로가 다릅니다

Windows 7 cmd 경로가 다릅니다

내 컴퓨터의 시스템 경로를 변경하려고 합니다.

어떤 이유로 실행을 통해 cmd를 열면 내 경로가 예상대로 정확합니다.

그러나 디렉토리에서 Shift+마우스 오른쪽 버튼을 클릭하고 여기에서 cmd 창을 열면 USER 또는 SYSTEM의 경로 변수에도 표시되지 않는 이전/다른 경로가 표시됩니다.

예:

RUN의 CMD:

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]

Shift+오른쪽 클릭의 CMD:

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.

이상한 문제가 있는지 확인하기 위해 시스템과 사용자 모두의 경로를 변경했지만 문제가 지속됩니다.

더 많은 정보가 필요하면 알려주세요.

편집: 경로 변경 사이에 모든 명령 프롬프트를 다시 시작했습니다.

편집 2: 경로는 다음과 같습니다.

RUN의 CMD:

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;

Shift+오른쪽 클릭의 CMD:

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사용하면 다른 인스턴스인 ( 의 자식 , 자식의 자식 )이 인스턴스를 생성합니다 .Shiftexplorersvchost.exeservices.exewininit.execmd

두 탐색기 버전 모두 동일한 환경 블록이 없으면 인스턴스에는 cmd동일한 변수가 없습니다.

환경 변수의 구성이 시스템 속성에서 변경되면 OS는 WM_SETTINGCHANGE모든 최상위 창에 메시지를 보냅니다. 데스크톱을 처리하는 인스턴스 explorer는 메시지를 수신하고 환경 블록을 업데이트하지만 파일 탐색을 처리하는 인스턴스(아래에 있는 인스턴스 svchost.exe)는 메시지를 처리하지 않으며(아니요, 지금은 이유를 모르겠습니다) 해당 환경 블록이 처리되지 않습니다. 업데이트되었습니다(이 모든 것은 sysinternal의 ProcExp프로세스 환경 확인을 통해 테스트되었습니다 ).

어떻게 해결하나요? 모르겠습니다. 어쩌면 (아니요, 테스트되지 않았습니다. 현재 컴파일러가 없습니다. 단지 아이디어일 뿐입니다.) a를 사용하여 메시지를 HWND_BROADCAST보내는 대신 WM_SETTINGCHANGE파일 브라우저 프로세스에 직접 메시지를 보내 문제를 해결할 수 있습니다(또는 해결하지 못할 수도 있습니다).

그것을 처리하는 방법? explorer상위 프로세스가 인 인스턴스를 종료합니다 svchost.exe. 새 파일 브라우저가 요청되면 올바른 환경 블록으로 새 인스턴스가 시작됩니다.

대략적으로 접근하려면 명령줄에서 실행해 보세요.

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

파일 브라우저를 종료합니다. 새 파일 브라우저가 요청되면 새 프로세스가 생성되고(이제 환경이 업데이트됨) 새 cmd인스턴스에 변경 사항이 표시됩니다.

편집됨

API 모니터로 몇 가지 테스트를 한 후 API 호출을 통해 프로세스가 svchost.exe생성되는 것을 확인했습니다 . 이 호출에서 인수는 null이 아니므로(null인 경우 환경은 상위에서 하위로 복사됨) 새 프로세스에 대한 환경도 생성됩니다. 그런데 새로운 환경을 만드는 데 어떤 소스가 사용되고 있습니까?explorerCreateProcessAsUserWlpEnvironmentsvchost.exe

regedit그래서 메시지가 전송 되지 않도록 레지스트리( )의 변수를 직접 변경하고 WM_SETTINGSCHANGE파일 브라우저 explorer인스턴스를 종료하고 두 cmd인스턴스를 생성했습니다. 결과는

  • Run방법: cmd인스턴스에 변경 사항이 표시되지 않습니다. 상위 프로세스에 대한 메시지가 없으므로 해당 환경은 변경되지 않았으며 새로 시작된 프로세스는 explorer.exe데스크톱을 처리하는 프로세스에서 변경되지 않은 버전을 상속합니다.

  • Shift+클릭 방법: 레지스트리의 변경 사항을 사용할 수 있습니다.

따라서 svchost.exe새로 생성된 프로세스에 전달할 환경 블록을 생성하기 위해 레지스트리에서 정보를 검색합니다.

답변2

경로를 변경한 후에는 다음 사항을 확인해야 합니다.탐색기 다시 시작모든 터미널을 다시 열려고 시도하기 전에. 이런 방식으로 Explorer 프로세스는 새 PATH를 사용하고 해당 새 PATH를 실행하는 새 프로그램으로 전송할 수 있습니다.

관련 정보