실행 후 명령 프롬프트가 닫히는 것을 방지하는 방법은 무엇입니까? (Windows 명령 프로세서)에서 실행된다는 것을 알지

내 문제는 Windows에는 실행 직후에 닫히는 명령 줄 창이 있다는 것입니다. 이 문제를 해결하기 위해 기본 동작은 창이 열린 상태로 유지되기를 원합니다. 일반적 으로이 행동은 내 생각에 오는 세 가지 방법으로 피할 수 있습니다.

  1. pause배치 프로그램 다음 에 줄을 두어 종료하기 전에 키를 누르라는 메시지를 표시합니다.
  2. (시작-실행-cmd.exe) 에서 이러한 배치 파일 또는 기타 명령 줄 조작 도구 (서비스 시작, 다시 시작 등 등 net start xy) cmd.exe실행
  3. 다음과 cmd /k같이 이러한 프로그램을 실행 하십시오. cmd /k myprogram.bat

그러나 사용자가 다른 경우가 있습니다.

  1. 프로그램을 처음으로 실행하고 주어진 프로그램이 명령 프롬프트 (Windows 명령 프로세서)에서 실행된다는 것을 알지 못합니다 (예 : 시작 메뉴 또는 다른 곳에서 바로 가기를 실행할 때). 또는
  2. 그것은 조금 불편 cmd.exe를 모든 시간을 실행하는 데 찾습니다 그 이후에 일시 중지를 넣어 또는 명시 적으로 종료되지 않도록 사방이 명령의 코드를 다시 작성하는 시간 / 기회가 없습니다.

자동 실행 항목 을 만들고 다음 위치에서 내용을 조작하여 명시 적으로 열 때의 기본 동작 변경에 대한 기사 를 읽었습니다 .cmd.exe

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun

(자동 실행 항목은 _String values_…)

나는 cmd /d /k그것을 시도하기 위해 그것의 가치로 넣었 지만, 이것은 위에서 언급 한 것들의 행동을 전혀 바꾸지 않았다 … 명시 적으로 그것을 열 때 명령 줄 창의 행동을 바꿨다 (Start-Run- cmd.exe).

어떻게 작동합니까? 이 문제를 해결하기위한 아이디어를 제공해 주시겠습니까?



답변

파일 .cmd.bat파일 에만 적용 할 수있는 솔루션이 있습니다 .

다음 regedit중 하나를 열고 이동하십시오.

[HKEY_CLASSES_ROOT\batfile\shell\open\command]
[HKEY_CLASSES_ROOT\cmdfile\shell\open\command]

이제 “기본 키 값”을로 변경하십시오 cmd.exe /k "%1" %*. 이제 모든 배치 스크립트 창은 실행 후에 계속 열려 있습니다.

cmd.exe /c cmd.exe /k program.bat이는을 사용 하는 것과 비슷합니다 . 즉, 다른 CMD 인스턴스가 상위 인스턴스로 시작됩니다. 첫 번째 /c인수 를 덮어 쓰는 방법을 찾을 수 없습니다 .

으로도 가능 [exefile]하지만 실행 파일에 GUI가 있으면 빈 콘솔 상자가 표시됩니다.


답변

마이크로 소프트 인용 :

콘솔에 연결된 마지막 프로세스가 종료되거나 FreeConsole을 호출하면 콘솔이 닫힙니다.

즉, Win32 콘솔 창은 마지막으로 실행되는 프로그램이 종료 될 때 항상 닫 히며 변경할 수 없습니다.


16 비트 MS-DOS 프로그램의 경우 Windows는 속성 대화 상자에서 “종료시 닫기”옵션을 제공하지만 위의 동작에 대한 예외는 아닙니다.이 창은 열린 상태로 유지하는 NTVDM 프로세스입니다. 또한이 옵션은 다음과 같습니다. 다시 프로그램마다.)


답변

배치 파일 위치에서 명령 프롬프트를 열고 배치 파일 이름을 수동으로 입력하여 해당 창 내에서 실행하십시오.

1. 실행 파일이있는 폴더로 이동합니다.
2. Shift- 오른쪽 클릭하고 “여기에서 명령 창”을 선택 합니다. 3. 실행 파일
이름을 입력하고 Enter 키를
누릅니다.


답변

cmd.exe /k배치에 문제가 생길 것입니다. 경우 배치 exit 1(없이이 /B) 콘솔이 종료됩니다. 트릭은 다음을 사용하는 것입니다.

cmd.exe /k cmd /c ...

모든 배치 파일에 기본적으로이를 사용하려면 HKEY_CLASSES_ROOT\cmdfile\shell\open\command\(default)HKEY_CLASSES_ROOT\batfile\shell\open\command\(default)로 설정하십시오 "%windir%\system32\cmd.exe" /k "%windir%\system32\cmd" /c "%1" %*.


답변

grawity의 답변 을 읽은 후 바보 같은 해결책을 찾았습니다 .

내 유스 케이스는 더 합리적인 솔루션이 모두 차단되는 직장에서 콘솔 환경을 설정하는 것이 었습니다. 필요한 것은 PATH를 설정하고 doskey 별칭을 구성하고 셸에 덤프하는 것입니다.

cmd배치 파일의 마지막 줄로 추가 된 내 솔루션 (Win7에서 테스트 됨) . 부모의 환경을 상속하는 중첩 된 명령 프롬프트를 실행합니다. 해당 하위 셸은 종료 할 때까지 배치 프로세스를 열린 상태로 유지합니다.이 시점에서 배치에는 하위 프로세스가없고 종료됩니다.


답변

PAUSE (필요할 때 PAUSE를 사용하는 것보다 CHOICE 또는 TIMEOUT을 선호 함)를 사용하는 대신 여기에서 솔루션을 사용할 수 있습니다. 886848 / how-to-make-windows-batch-file-pause-wuse-double-clicked .

이런 식으로 Windows 탐색기에서 배치 파일 또는 링크 (바로 가기)를 클릭하면 배치 파일 프로그램이 종료되기 전에 일시 중지하여 프로그램 출력 및 오류 메시지를 볼 수 있습니다.

CHOICE를 사용하여 사용자가 수행 할 다양한 조치를 선택할 수있는 기능을 프로그래밍 할 수 있으며 TIMEOUT을 사용하면 시간 지연 (무인) 후 창을 닫을 수 있습니다. 명령 프롬프트 창에서 배치 파일을 실행하면 이러한 일시 중지가 성 가실 수 있습니다.

연결된 솔루션을 사용하면 명령 프롬프트 창에서 배치 파일을 실행 한 경우 일시 중지를 건너 뛸지 여부를 결정할 수 있습니다.

제공된 링크에서 자세한 내용을 읽을 수 있지만 기본 사항은 환경 변수를 사용한다는 것입니다.

%cmdcmdline%

배치 파일이 명령 창에서 실행되었는지 여부를 판별합니다.

따라서 다음과 같이 사용하십시오.

배치 파일이 종료되는 시점에 다음과 같은 코드를 추가하십시오.

echo %cmdcmdline:"=-% | find /i "cmd /c --%~dpf0%-"
if %errorlevel% NEQ 0 goto :EOF
pause
goto :EOF

rem if %errorlevel% EQU 0 batch-file: %~dpf0 was executed from Windows Explorer, ...
rem if %errorlevel% NEQ 0 batch-file: %~dpf0 was executed from within a Command Prompt


답변

이 문제를 해결하는 가장 좋은 방법은 start를 사용하여 다른 배치 파일에서 배치 파일을 호출하는 것입니다.

따라서 일반적으로 go.bat라는 파일을 실행하면 go2.bat와 같은 이름의 두 번째 배치 파일이 생성됩니다.

go2.bat의 내용은

start go.bat

첫 번째 창이 즉시 닫히지 만 go.bat를 실행하는 창이 열려 있습니다.