Windows에서 NVM-Desktop으로 Node.js 버전을 전환한 후 code 명령으로 Visual Studio Code를 여는 경우, 부모 cmd.exe 창이 종료되지 않고 계속 표시되는 경우가 있다. 이 현상은 code.cmd 래퍼가 code.exe를 새로운 콘솔 세션으로 실행하면서 부모-자식 프로세스 간 분리가 제대로 이루어지지 않아 발생한다.
문제 증상
일반적으로 VSCode를 실행하면 명령 프롬프트는 곧바로 닫히고 IDE만 남아야 한다. 하지만 일부 시스템에서는 첫 번째 cmd 창이 백그라운드에 아 있으며, 이후 실행되는 창은 정상적으로 종료된다. 이는 프로세스 트리 관리 방식에 따른 비결정적 동작으로 보인다.
원인 분석
VSCode 설치 시 생성되는 code.cmd는 code.exe를 실행하기 위한 중간 스크립트이다. 이 스크립트는 START 명령이나 call 방식에 따라 자식 프로세스의 콘솔 핸들을 상속받게 되며, Windows 솔 호스트(conhost.exe)는 자식이 분리되었는지 판단하지 못해 부모 셸을 계속 유지하게 된다.
특히 NVM-Desktop은 Node.js 바이너리 경로를 동적으로 변경하므로, PATH 해석 순서가 바뀌면서 code.cmd의 실제 경로가 예상과 다르게 매핑될 수 있다.
해결 방안
1. 직접 실행 파일 호출
래퍼 스크립트 대신 실행 파일을 직접 호출한다.
set VSCODE_BIN=%LocalAppData%\Programs\Microsoft VS Code\bin\code.cmd
start "" "%LocalAppData%\Programs\Microsoft VS Code\Code.exe" %*
2. 환경 변수 우선순위 정리
NVM-Desktop이 전환한 Node.js 경로와 VSCode 경로가 PATH에서 올바른 순서로 배치되도록 확인한다. PowerShell에서 다음과 같이 검사할 수 있다.
$env:PATH -split ";" | Select-String -Pattern "VS Code|nodejs|nvm"
3. VSCode 내부 터미널 설정
settings.json에서 콘솔 호스트 및 셸 통합 옵션을 명시적으로 설정한다.
{
"terminal.integrated.windowsEnableConpty": true,
"terminal.integrated.shellIntegration.enabled": true,
"terminal.integrated.defaultProfile.windows": "PowerShell"
}
기술적 배경
Windows에서 콘솔 창은 프로세스가 아닌 솔 세션 단위로 관리된다. code.cmd가 code.exe를 실행하면 CREATE_NEW_CONSOLE 래그가 누락된 경우, 자식 프로세스가 부모의 콘솔 핸들을 공유하게 되어 부모 cmd.exe가 종료 조건을 만족하지 못한다. 직 Code.exe를 호출하거나 start 명령으로 분리하면 Windows는 자식을 독립적인 그래픽 프로세스로 인식해 콘솔 을 즉시 해제한다.
권장 설정
개발 워크플로우를 정리하기 위해 다음과 같은 습관을 권장한다.
- VSCode 실행용 배치 파일이나 PowerShell 함수를 만들어 경로를 축약한다.
- NVM-Desktop 전환 후
where code명령으로 실제 매 경로를 확인한다. - Windows Terminal이나 PowerShell 7을 기본 터미널로 사용해 레거시 conhost 의존성을 줄인다.