실행 후 명령 프롬프트가 닫히는 것을 방지하는 방법은 무엇입니까?


54

내 문제는 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).

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


10
모든 설명과 함께 당신의 질문은 내 머리가 폭발하고 싶어했다. 다음과 같이 말할 수 있습니까?이 "example"명령으로 배치 파일을 실행하고 완료되면 명령 상자를 열어두기를 원합니다. 그게 당신이 요구하는 것입니까? 코드 샘플을 가까이에 넣으십시오.
KCotreau

1
+1 동의 함. 조금 자세하게 설명하려면 질문을 다시 검토하고 가능한 경우 예를 사용하고 더 간결한 질문을 작성하십시오.
slotishtype

2
이것은 정상적인 행동이며, 귀하의 질문은 확실히 유효하지만, 왜 명령 프롬프트를 열어 두어야하는지 질문해야합니다 (대부분의 유틸리티는이 경고를 염두에두고 작성됩니다).
획기적인

1
제 생각에는 이것은 실제 질문이 아닙니다. 사용자에게 배치 파일을 대신 사용하도록 지시하십시오. 그것이 질문의 의도가 아닌 경우, 혼란스러운 정보를 제거하여 질문을 명확히하고 실제 목표가 무엇인지 설명하십시오. 확실하지 않은 경우 정답을
찾기

1
@Randolf Richardson은 최종 사용자가 이러한 도구를 볼 수 없기 때문 입니다 (결국 우리는 지금 GUI를 사용합니다). 이러한 정보가 필요한 경우 대부분의 IT 그룹은 배치 파일을 보내 적절한 시스템 정보를 수집하여 표시합니다. 이 질문에 대한 해결책이 발견되면, 그것은 것이라는 가능한 방법을 볼 수 없습니다 원인이 너무 많은 것들을이 전송됩니다 - 그것은 해결 적은 다음 문제를 stdout좋은 이유가 볼 수 있도록 의미하지 않았다 일정한 기준.
획기적인

답변:


27

파일 .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가 있으면 빈 콘솔 상자가 표시됩니다.


4
주어진 질문에 실제로 대답하는 유일한 해결책이 여기에 있습니다. 불행히도, 이것은 메모리 누수가 발생할 수 있다고 생각합니다. CMD 행에 CMD.EXE를 지정하지 않고 서비스가 새 배치 파일을 시작하면 어떻게됩니까? 이 경우이 코드를 사용하지 않습니까? 대화 형이 아닌 데스크톱에서 새 창을 만들어 다시 시작할 때까지 열어 두지 않겠습니까?
krowe2

@APerson 편집을 수행하면 명령이 포함되지 않아 명령이 깨졌습니다 *. 편집 할 때 더 조심하십시오!
not2qubit

@ not2qubit 죄송합니다. 별표 2 개 대신 별표 3 개를 삭제했습니다. 할 것이다.
APerson

17

마이크로 소프트 인용 :

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

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


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


13
콘솔 창이 닫히는 방법이유 를 이해하기위한 +1 설계된대로 동작하며 IMHO와 같은 방식으로 유지되어야합니다. 이것이 우리가 처음에 표준 스트림과 배치 파일을 갖는 주된 이유입니다.
획기적인

27
@Breakthrough 문제는 How can I do X아닙니다 In your opinion, should I do X. 이 답변은 도움이되지 않습니다. 일부 솔루션이 이미 다른 곳에 제시되었을 때 X는 불가능하다는 것을 암시합니다. (-1)
Superbest

7

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

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


1
Shift + 오른쪽 클릭에 대해 몰랐습니다. 그러나 exe를 cmd 창으로 끌어서 놓으면 자동으로 경로가 표시됩니다.
Superbest

1
이것은 일반적으로 나를 위해 작동하지만 현재 상황에서 작동하지 않기 때문에 정확하게 솔루션을 검색하기 때문에 확실하지 않습니다.
RenniePet

이것은 가장 쉬운 해결책이며 정답으로 표시되어야합니다.
Vicky Kapadia

4

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" %*.


1
그 생각 "%*"한 번으로, 전체 매개 변수 목록을 전달하므로이 두 번 첫 번째 매개 변수를 전달하지 않을 "%1"의 첫 번째 매개 변수로 다시 "%*"?
Kevin Fegan

1
@KevinFegan 이유를 확인하지는 않았지만 % 1은 따옴표를 유지해야하므로 경우에 따라 큰 따옴표로 묶을 수 있습니다. 차이도있다 %1 %2 %3 ..그리고 %*내가 지금 기억이 안하지만, %1 %2 %3어떤 경우에는 작품 %*실패는.
Wernight

3

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

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

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


2

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

1

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

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

go2.bat의 내용은

start go.bat

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


이것은 방금 명령 프롬프트 실행 파일의 이름을 하나의 bat 파일 (1.bat)에 넣고 두 번째 bat 파일 "start 1.bat"에서 start 명령을 사용하여 호출합니다. 명령 창이 열려 있습니다.
ejectamenta

1

Windows 레지스트리 편집기 버전 5.00에서 작동합니다.

[HKEY_CLASSES_ROOT\batfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

[HKEY_CLASSES_ROOT\cmdfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

위의 cmd를 비슷한 파일에 저장 cmdbatfile-open.reg하고 실행하십시오!


2
Stack Exchange에 오신 것을 환영합니다! 귀하의 답변 형식을 수정했습니다. 서식 도움말은 여기를 참조하십시오. 또한 코드를 게시 할 때 코드의 정확한 기능을 설명하십시오. 응답 방법 을 읽을 수도 있습니다 .
Blacklight Shining

1

자체 인스턴스에서 시작하고 실행 파일이 종료되는 경우 계속 열려고하는 배치 파일이 두 개 있다고 가정합니다. 두 일괄 처리를 호출 할 수 있습니다 A.batB.bat.

이제 간단하게 배치 파일을 사용하여 두 파일을 모두 실행할 수 있습니다 launch_both.bat. 내용으로 호출 해 보겠습니다 .

start cmd /k "A.bat & cmd /c"
start cmd /k "B.bat & cmd /c"

exit두 배치 파일 중 하나 를 호출하면 예상대로 작동하지 않을 수 있습니다. 테스트해야합니다.


0

Windows 10을 사용하는 사용자의 경우 현재 위의 답변 중 어느 것도 Windows 10에서 작동하지 않습니다.

Windows 10의 경우 스크립트에 액세스 할 수있는 경우 끝에 다음 코드를 추가해야합니다.

read

해당 코드는 입력을 기다렸다가 닫습니다.


질문은 Windows 10 (5 년 전) 이전에 요청 된 것을 기억하십시오. 자세한 정보를 사용하여 답변을 편집하십시오
yass

0

다운 그레이드 된 PSIXO에 대한 답변- "이 답변은 이미 해당 질문에 포함되어 있습니다. – Ro Yo Mi Jan 20 '16 at 5:06"– 아니요. 이전 답변은 "일시 정지"인데 작동하지 않았습니다. PSIXO의 답변은 "& pause"인데, 작동합니다. 다운 그레이드하기 전에 더 신중하게 구문 분석하십시오. 나는 이것을 IDLE 프롬프트에서 실행했으며 작동했습니다.

    >>> os.system('dir ^ & pause')
    0
    >>> 

반면에 :

    >>> os.system('dir ^ pause')
    1
    >>>

작동하지 않습니다 (cmd 프롬프트가 튀어 나와 실제로 오류 (1)가 반환 됨). 필요한 답변에 대한 PSIXO에게 감사합니다. 헨리.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.