배치 파일에서 잠자는 방법?


132

명령과 다음 파일 사이의 Windows 배치 파일에서 잠시 동안 실행을 일시 중지하는 방법은 무엇입니까?


이것이 정식이 되려고합니까? 그렇다면 일부 설명 텍스트가 적합 할 수 있습니다.
John Gardeniers

2
"설명 텍스트"는?
Massimo

2
내가 본 것은 아니지만 대부분의 정식 질문에는 해당 질문의 의도를 설명하는 텍스트가 포함됩니다.
John Gardeniers

또는 상황을 설명하는 일부 텍스트 ... SEO를 돕고 잠재적 인 답변을 구성하는 데 도움이됩니다.
Chris S

2
SEO는 잘 작동합니다. Google 검색에서 처음 방문했습니다.
jbo5112

답변:


194

배치 파일에서 잠자기하는 올바른 방법 timeout은 Windows 2000에 도입 된 명령 을 사용하는 것 입니다.

29 초에서 30 초 사이의 대기 시간 :

timeout /t 30

사용자가 아무 키나 누르면 시간 초과가 중단됩니다. 그러나이 명령은 또한 선택적 switch를 허용합니다.이 스위치 /nobreak는 명시 적을 제외하고 사용자가 누를 수있는 모든 것을 무시합니다 CTRL-C.

timeout /t 30 /nobreak

또한 명령이 화면에 카운트 다운을 인쇄하지 않게하려면 출력을 NUL다음으로 리디렉션 할 수 있습니다 .

timeout /t 30 /nobreak > NUL

6
2003 Resource Kit가 설치된 경우에도 시간 종료 명령이 Windows XP에서 작동하지 않고 Windows 7에서 휴면 명령이 작동하지 않으므로 Win7 및 WinXP에서 배치 파일을 사용하는 경우 ping 명령을 계속 사용할 수 있습니다.

12
비 대화식 스크립트에서 시간 초과가 작동하지 않습니다. "오류 : 입력 리디렉션이 지원되지 않아 프로세스가 즉시 종료됩니다." 때로는 "ping"과 함께 핵을 사용하는 것이 좋습니다.
iMysak

14

여기에도 적용되므로 다른 사이트에서 답변을 복사 합니다 .

핑을 사용하려면 더 좋은 방법이 있습니다. 존재하지 않는 주소를 핑하려는 경우 밀리 초 단위로 시간 초과를 지정할 수 있습니다. 다행히 이러한 주소는 표준 (RFC 3330)에 정의되어 192.0.2.x있습니다. 이것은 구성이 아니며 실제로 존재하지 않는 유일한 목적을 가진 주소입니다 (명확하지는 않지만 로컬 네트워크에서도 적용됩니다).

192.0.2.0/24-이 블록은 문서 및 예제 코드에서 사용하기 위해 "TEST-NET"으로 할당됩니다. 벤더 및 프로토콜 문서에서 도메인 이름 example.com 또는 example.net과 함께 사용되는 경우가 많습니다. 이 블록 내의 주소는 공용 인터넷에 나타나지 않아야합니다.

123 밀리 초 동안 자려면 ping 192.0.2.1 -n 1 -w 123 >nul


3
실제 주소를 ping하는 것보다 약간 낫 더라도 그렇게하지 마십시오 . Ping단순히 작업에 대한 잘못된 도구입니다.
Massimo

1
@Massimo 그것은 의도 된 것이 아닐 것입니다. :) 여전히 좋은 해결책이라고 생각합니다. 일부 시나리오 (특히 더 높은 해상도)에서 시간 초과보다 더 잘 작동합니다. 또한 꽤 잘 알려 지므로 대부분의 사람들은 배치 파일에서 볼 때 놀라지 않을 것입니다.
mafu

2
@Massimo 좋아! 우리는 다른 견해를 가지고 있다고 생각합니다. 마음에 들지 않으면 가장 자주 설명하는 것처럼 localhost를 n 번 ping하는 것보다 낫기 때문에이 답변을 그대로 두겠습니다.
mafu

7
제한 시간은 작동하는 운영 체제에 적합한 솔루션입니다. 핑은 5.1-6.3에서 작동하는 유일한 솔루션입니다. 시스템의 25 %가 여전히 5.1 인 상태에서 시간 초과는 "올바른 방법"이 아닙니다.
Wyrmwood

3
시간 종료는 Windows 10에서도 치명적이므로 운영 체제에 잘못된 솔루션입니다. 입력이 경로 재 지정되어 실패하는 명령의 용도는 무엇입니까?
Harry Johnston

8

localhost에 ping을 삽입 할 수도 있습니다. 완료하는 데 4 초가 걸립니다 (기본적으로). 일부에서는 kludge로 간주되지만 완전히 동일하게 작동합니다.

명령 :
ping 127.0.0.1


6
흠 ...이 Q / A의 전체 목적은 이것을 정답으로 받아 들인 다른 두 가지 질문을 정확하게 수정하는 것이었지만 OP가 더 이상 존재하지 않기 때문에 더 이상 수정할 수 없습니다.
Massimo

6
작동하는 동안 망치로 나사를 구동하는 것과 같습니다. 잘못된 도구가 작동 할 수 있지만 여전히 잘못되었습니다.
voretaq7

1
@MarkAllen 다시 말해, Windows NT4, 95, 98, ME 이상입니까?
Chris McKeown

5
@MarkAllen-기술적으로 pingOS와 함께 제공 되는지 여부에 대해 걱정해야합니다 . '95'98 또는 ME에 대해 충분히 걱정한다면 6.22에 대해 똑같이 걱정해야 ping합니다
Mark Henderson

4
@MarkHenderson 이전에 듣지 못한 명령이 포함되어 있는지 여부를 기억하는 것보다 OS의 특정 릴리스가 TCP / IP를 지원하는지 여부를 기억하는 것이 더 쉽습니다. 당신은 알고 있습니까?
Mark Allen

2

면책 조항 : 이것은 "이상적인"솔루션이 아니므로 권장하는 사람들과 같은 일로 나를 머리 위로 때리게하지 마십시오 ping...

가능하면 사용 timeout하십시오. 그러나 의견에서 언급했듯이 항상 옵션이 아닙니다 (예 : 비 대화식 모드). 그 후, 나는 ping"kludge"가 아마도 가장 간단한 옵션 일 것입니다. 즉, 다른 옵션을 제공합니다 ... VB 스크립트를 포함하십시오 .

이 솔루션의 기초에는이 외에도 다양한 종류의 응용 프로그램이 있습니다. 종종 VBS는 배치가 할 수없는 일을 할 수 있거나 최소한 훨씬 더 쉽게 할 수 있습니다. 여기에 설명 된 기술을 사용하여 두 가지 ( "완벽하게"가 아니라 "기능적으로"...)를 혼합 할 수 있습니다.

다음은 임시 스크립트를 생성하고 실행 한 다음 삭제하는 하나의 라이너입니다. 스크립트는 수면을 수행합니다 (이 예에서는 3 초 동안).

echo WScript.Sleep 3000 > %temp%\sleep.vbs & cscript %temp%\sleep.vbs %sleepMs% //B & del %temp%\sleep.vbs

약간 다르게 작성된 기본적으로 동일한 내용이 있습니다.

set sleepMs=3000 & set sleepVbs=%temp%\sleep.vbs & echo WScript.Sleep WScript.Arguments(0) > %sleepVbs% & cscript %sleepVbs% %sleepMs% //B & del %sleepVbs%

그리고 마지막으로, 같은 ping, CScript그 자체가 시간 제한 옵션이 있습니다! 따라서 스크립트에 무한 루프를 입력하면 인터프리터가 지속 시간을 적용하도록 할 수 있습니다. 이 작업은 CPU를 사용하는 "바쁜"작업이므로 WScript.Sleep절차를 사용할 수있을 때는 권장하지 않지만 완전성을 위해 개념적 옵션으로 제공합니다.

set sleepSec=3 & set sleepVbs=%temp%\sleep.vbs & echo While True > %sleepVbs% & echo Wend >> %sleepVbs% & cscript %sleepVbs% //B //T:%sleepSec% & del %sleepVbs%

알다시피 ... 파일을 작성하지 않고도 powershell 에서이 작업을 수행 할 수 있습니다.
Harry Johnston

예, 이것은 다른 좋은 해결책 일 것입니다.하지만이 방법은 이전 버전의 Windows와 호환됩니다.
BuvinJ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.