배치 파일에서 자


150

Windows 상자에서 무언가를 자동화하기 위해 배치 파일을 작성할 때 몇 초 동안 (보통 테스트 / 대기 루프에서 프로세스가 시작될 때까지) 실행을 일시 중지해야했습니다. 당시 내가 찾은 최고의 솔루션은 핑을 사용하여 원하는 효과를 얻습니다. 다음과 같이 구현 된 호출 가능한 "wait.bat"를 설명하는 여기 에서 더 나은 작성을 발견했습니다 .

@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul

그런 다음 대기 시간 (초)을 지나서 고유 한 배치 파일에 wait.bat 호출을 포함시킬 수 있습니다.

분명히 Windows 2003 Resource Kit는 유닉스와 같은 절전 명령을 제공합니다 (마지막으로!). 한편, 여전히 Windows XP, Windows 2000 또는 (슬프게도) Windows NT 를 사용하는 사람들에게는 더 좋은 방법이 있습니까?

허용 된 답변sleep.py 에서 스크립트를 수정하여 명령 줄에 인수가 전달되지 않으면 기본적으로 1 초로 설정되었습니다.

import time, sys

time.sleep(float(sys.argv[1]) if len(sys.argv) > 1 else 1)

Windows 2003 Resource Kit 의 Microsoft 다운로드 페이지 는 XP에서도 작동 함을 나타냅니다. 다른 선택의 여지가 없지만 대기를 위해 '외부'유틸리티를 사용하는 것이 두렵습니다. XP 명령 프로세서에는 이와 같은 것이 없습니다.
GerG

2003 서버 리소스 키트 (그리고 아마도 W2K와) 윈도우 XP와 함께 작동
마틴 베켓

나는 과거에도 같은 문제에 직면했고 핑을 사용했다. (위의 말은 분명히 이것이 어리 석다는 것을 깨달았다.)).
Jack Leow


2
몇 가지 옵션이 있습니다. ping명령 으로 절전 모드를 에뮬레이트 하거나 명령이 포함 된 Windows 리소스 키트를 다운로드하십시오 sleep. 자세한 내용은 여기 : 배치 파일 SLEEP Command
Rudu

답변:


14

최신 정보

timeout다른에 설명 된대로 이후 윈도우 비스타에서 사용할 수 있으며 명령, 명령, 사용되어야한다 대답 이 질문에. 여기에 오는 것은 오래된 대답입니다.

이전 답변

파이썬이 설치되어 있거나 설치에 신경 쓰지 않는다면 (다른 용도도 있습니다 :) 다음 sleep.py 스크립트를 만들고 PATH 어딘가에 추가하십시오.

import time, sys

time.sleep(float(sys.argv[1]))

필요한 경우 1 초 미만의 일시 중지 (예 : 1.5 초, 0.1 등)가 가능합니다. 을 호출하지 sleep않고 PATHEXT 환경 변수에 확장자를 sleep.py추가 할 수 있습니다 .PY. Windows XP에서는 다음에서 편집 할 수 있습니다.

내 컴퓨터 → 속성 (메뉴) → 고급 (탭) → 환경 변수 (버튼) → 시스템 변수 (프레임)


32
배치 스크립팅 가능한 솔루션이 요청 될 때 왜 파이썬으로 스크립트를 작성해야합니까? 경로 확장은 Windows 사용자에게 파이썬 인터프리터가 설치되지 않은 문제를 어떻게 해결할 수 있습니까? 감사.
Val

6
이식성을 위해 완벽하게 훌륭한 대안이 있기 때문에이 솔루션을 피해야한다고 생각합니다.
Gras Double

1
이 접근 방식은 과거에 해결 방법을 제공했을 수도 있지만 @Blorgbeard가 설명한 기본 솔루션은 분명히 갈 길입니다.
Mike

227

timeout명령은 Windows Vista 이상에서 사용할 수 있습니다.

c:\> timeout /?

TIMEOUT [/T] timeout [/NOBREAK]

Description:
    This utility accepts a timeout parameter to wait for the specified
    time period (in seconds) or until any key is pressed. It also
    accepts a parameter to ignore the key press.

Parameter List:
    /T        timeout       Specifies the number of seconds to wait.
                            Valid range is -1 to 99999 seconds.

    /NOBREAK                Ignore key presses and wait specified time.

    /?                      Displays this help message.

NOTE: A timeout value of -1 means to wait indefinitely for a key press.

Examples:
    TIMEOUT /?
    TIMEOUT /T 10
    TIMEOUT /T 300 /NOBREAK
    TIMEOUT /T -1

참고 : 입력 리디렉션에서는 작동하지 않습니다. 간단한 예 :

C:\>echo 1 | timeout /t 1 /nobreak
ERROR: Input redirection is not supported, exiting the process immediately.

8
콘솔없이 사용할 수 없습니다. "오류 : 입력 리디렉션이 지원되지 않아 프로세스가 즉시 종료됩니다."
simpleuser

배치 파일이 다른 프로세스의 포크, cygwin crontab 또는 원격 ssh 명령 등을 통해 백그라운드에서 실행될 때와 같이 콘솔이 전혀없는 경우를 의미했습니다.
simpleuser

1
그래, 알아 내가 준 예제는 오류를 보여주기위한 것입니다 :)
Blorgbeard는

3
링크 에 대한 설명서에 timeout@Cristian Ciupitu 추가는, 부분적으로 잘못 - 윈도우 XP는이 명령이 없습니다.
martineau

1
귀하의 % PATH %에 문제가있는
@HelloWorld

21

ping요약 된 방법을 사용하는 것은 더 많은 실행 파일을 추가하거나 다른 소프트웨어를 설치할 수 없거나 원하지 않을 때 수행하는 방법입니다.

존재하지 않는 것을 핑 (ping)해야하고, -w그 시간이 지나면 (localhost와 같은) 시간 있는 핑을하지 않고 플래그가 해당 시간 후에 실패하도록해야합니다 -n. 이렇게하면 1 초 미만의 시간을 처리 할 수 ​​있으며 약간 더 정확하다고 생각합니다.

예 :

(1.1.1.1이 취해지지 않은 테스트)

ECHO Waiting 15 seconds

PING 1.1.1.1 -n 1 -w 15000 > NUL
  or
PING -n 15 -w 1000 127.1 >NUL

와 즉시 반환PING: transmit failed. General failure.
huysentruitw

IP 1.1.1.1는 CloudFlare에서 가져 오므로 15 초 동안 기다리지 않고 약 1ms 정도 걸립니다.
dhcgn

16

SLEEP.exeWindows XP에도 설치할 수있는 Windows Server 2003 Resource Kit 와 같은 대부분의 Resource Kit에 포함되어 있습니다.

Usage:  sleep      time-to-sleep-in-seconds
        sleep [-m] time-to-sleep-in-milliseconds
        sleep [-c] commited-memory ratio (1%-100%)

15

여기에서 찾은 답변에 동의하지 않습니다.

배치 파일에서 지연을 수행하기 위해 Windows XP 기능을 완전히 기반으로 한 다음 방법을 사용합니다.

DELAY.BAT :

@ECHO OFF
REM DELAY seconds

REM GET ENDING SECOND
FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, ENDING=(H*60+M)*60+S+%1

REM WAIT FOR SUCH A SECOND
:WAIT
FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, CURRENT=(H*60+M)*60+S
IF %CURRENT% LSS %ENDING% GOTO WAIT

지연 간격이 자정을 지날 때도 방법이 작동하도록 계산에 요일을 삽입 할 수도 있습니다.


15
이것은 정확해야하지만 CPU를 많이 사용하는 방법입니다. 일반적으로 프로세스가 대기하는 동안 CPU주기를 소비하지 않도록 무정지 기반 구현을 원합니다. 이것은 대부분의 배치 상황에서와 같이 드물게 짧은 대기에는 문제가되지 않습니다. 그러나 대기 시간이 길어 지속적으로 실행되는 프로세스는 시스템 성능에 부정적인 영향을 줄 수 있습니다.
dbenham 2019

4
시스템 클럭을 사용하므로 정확도는 1 초입니다. 2 초가 지정된 경우 지연은 2 초에서 3 초 (실제로 2.99999 ... 초) 사이 일 수 있습니다.
Peter Mortensen

시간이 지금 7:59:59이고 7 초 동안 대기하려면 어떻게해야합니까? 이를 고려하지 않은 것 같습니다.
ashes999

이것은 시스템 시간을 계산하는 것보다 더 많은 CPU 시간을 소비합니다. 또한 10보다 작은 분과 초가 TIME명령 에서 앞에 0으로 표시되므로 8 진수로 산술 연산을 수행하고 있습니다.
Andreas

2
@ mrt : 문제는 %TIME%포인트 대신 쉼표를 사용하여 센티 초를 구분한다는 것입니다! 에 쉼표를 추가하십시오 DELIMS=:.,"...
Aacini

13

비슷한 문제에 직면했지만 동일한 작업을 수행하기 위해 매우 짧은 C ++ 콘솔 응용 프로그램을 중단했습니다. 전체 리소스 키트를 다운로드 / 설치하는 것보다 MySleep.exe 1000을 실행하기 만하면 됩니다.

#include <tchar.h>
#include <stdio.h>
#include "Windows.h"

int _tmain(int argc, _TCHAR* argv[])
{
    if (argc == 2)
    {
        _tprintf(_T("Sleeping for %s ms\n"), argv[1]);
        Sleep(_tstoi(argv[1]));
    }
    else
    {
        _tprintf(_T("Wrong number of arguments.\n"));
    }
    return 0;
}

10

서버 결함에서 비슷한 질문이 있었고 해결책 은 다음 과 같습니다.

choice /d y /t 5 > nul

7
참고 : 선택 사항은 Windows XP에 포함되어 있지 않습니다. Windows 9x에 있었고 XP에서 제거되었으며 Vista 용으로 다시 추가되었습니다.
Devin Burke

7
나는 이것을 전혀 추천하지 않습니다. 적어도 CHOICE내가 아는 모든 버전 에서 누군가가 기다리는 동안 버튼을 누르면, 참을성이없는 사람들이 때때로하는 경우 선택은 입력을 등록하고 잘못된 입력에 대해 시스템 경고음을 주며 카운트 다운 타이머를 정지시킵니다. 그들이 N 또는 Y를 누르지 않는 한 거기에 있습니다. 그리고 만약이 두 가지 중 하나를 누르면, 5를 기다리지 않고 바로 선택이 끝납니다. 또한,이 선택은 정말 이상한 Vista 구문을 사용하고 있습니다. 모든 일반적인 선택 명령이 대신 사용 CHOICE /T:Y,5 > NUL됩니다. /D이전 버전 에는 플래그 가 없습니다 .
스타일로 코딩하기

1
결론적으로, 내가 아는 CHOICE 명령은 기본 언어에 따라 기본 예 / 아니오 버튼이 다르므로 명시 적으로 /C:YN또는 지정하지 않고 기본 [Y, N] 선택에 의존하는 경우 /C:Y예를 들어, 기본적으로 [J, N]을 수행 할 스웨덴어 선택 명령이있는 경우에는 작동하지 않습니다. 그래서 이것은 모든 종류의 문제에 빠져 있습니다.
스타일로 코딩하기

1
@Coding Win7에서 이것을 테스트했으며 사용자가 버튼을 누르면 경고음이 울리지 만 버튼을 누른 후 5 초 후에도 시간 초과됩니다. 따라서 사용자가 키를 계속 누르고 있으면 시간이 초과되지 않습니다. 또한 제 경우에는 이것을 사용할 때 사용자가 버튼을 누를 수 없도록 콘솔을 숨기고 있다고 생각합니다. 이 시스템에서는 Python에 액세스 할 수 없었고 (다른 답변에서 제안한대로) 시스템에 내 자신의 exe를 삭제할 수 없었습니다. 나는 할 수있는 일이 상당히 제한적이었습니다. 무엇을 추천 하시겠습니까?
mlsteeves

@mlsteeves 모든 Windows, DOS 등은 각각 다른 선택 명령을 가지며 Xp에서는 일반적으로 사용할 수 없습니다. 많은 선택 명령은 미묘하게 다른 동작을 가지며 일부는 다른 구문을 갖습니다. 저는 일반적으로 잠이 필요할 때 ping 명령을 사용합니다. 추악하지만 신뢰할 수 있습니다.
스타일로 코딩하기

9

Windows cscript WSH 레이어와이 wait.js JavaScript 파일을 사용할 수 있습니다 .

if (WScript.Arguments.Count() == 1)
    WScript.Sleep(WScript.Arguments(0)*1000);
else
    WScript.Echo("Usage: cscript wait.js seconds");

1
그러나 그룹 스크립팅을 통해 Windows 스크립팅 호스트를 비활성화 할 수 있습니다.
Joey

8

호환성 요구에 따라 다음 중 하나를 사용하십시오 ping.

ping -n <numberofseconds+1> localhost >nul 2>&1

예를 들어 5 초 동안 기다리려면

ping -n 6 localhost >nul 2>&1

또는 Windows 7 이상에서 다음을 사용하십시오 timeout.

timeout 6 >nul

2
-w밀리 초 단위이며 -n핑 횟수이며 핑 간격의 기본 시간은 1 초입니다.
Joey

8

핑을 사용할 수 있습니다 :

ping 127.0.0.1 -n 11 -w 1000 >nul: 2>nul:

10 초간 기다립니다.

11을 사용해야하는 이유는 첫 번째 핑이 1 초가 아닌 즉시 종료되기 때문입니다. 이 숫자는 항상 대기하려는 시간 (초)보다 하나 더 많아야합니다.

의 목적은 -w1 초 정도 기다리지 않는 것입니다 . 그것은 당신이 더 나올 때까지 기다리는 것이 없도록입니다 보다 네트워크 문제가있는 경우에 비해 1 초. ping자체적으로 초당 하나의 ICMP 패킷을 보냅니다. 아마도 localhost에는 필요하지 않지만 오래된 습관은 열심히 죽습니다.


중요한 실시간 처리에는이 기능을 사용하지 않는 것이 좋습니다. PING 명령을 사용하고 있기 때문에이 WAIT 배치 파일이 몇 밀리 초 이상 실행될 수 있습니다.
Wael Dalloul

12
@Wael, 1 초 경계를 기다리는 경우 몇 밀리 초는 관련이 없습니다. 당신이 실시간 물건 cmd.exe를를 사용하는 경우, 당신은 당신이 :-) 얻을 모든 것을받을 자격
paxdiablo

-w는 시간 종료 값입니다. 응답 을 기다리는 데 걸리는 시간 은 밀리 초 입니다. 핑 사이의 대기 시간은 아닙니다 .
quux

@quux, 나는 어디에 -w시간 초과가 없다고 말 했는가 (명확성이 부족하기 때문에 일부는 그것을 유추 할 수 있음을 인정하지만) 실제로는 각 사이클 이 할당 된 것보다 많은 시간이 걸리는 네트워크 문제가있는 사이클 시간을 제한하는 데 사용됩니다 둘째. 이를 명확히하기 위해 끝에 단락을 추가했습니다.
paxdiablo

문제는 핑이 더 빨리 반환되면 핑 사이에 1 초 동안 기다리지 않을 수 있다는 것입니다. 따라서 대기 루프는 생각보다 빠르게 종료됩니다.
quux

7

핑을 사용하여 잘 수있는 더 좋은 방법이 있습니다. 존재하지 않는 주소를 핑하려는 경우 밀리 초 단위로 시간 초과를 지정할 수 있습니다. 다행히 이러한 주소는 표준 (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


네, 작성하는 것보다 이해하기 쉽게 하나를 추가 받는 -n매개 변수입니다.
Peter Mortensen

그러나 100 핑을 사용하여 측정했습니다. -n 3 -w 124를 사용하면 실제 시간은 정확히 (3 + 1) * (124 + 1) = 4 * 125 = 500ms입니다. 타이밍은 놀랍게도 안정적이며, 판독시 10ms 분해능 (정확한 CMD 프롬프트로)과 정확하게 일치하며 기본 해상도는 10ms보다 확실히 우수합니다 (일반적인 16ms 틱 해상도의 영향을받지 않음).
피터 Mortensen

@mafu 192.0.2.0/24를 사용해서는 안된다고해서 사용할 수 없다는 의미는 아니므로 에코 요청에 대한 응답이 없다고 보장 할 수는 없습니다. 예를 들어, 모든 Windows PC에 고정 IPv4 주소 192.0.2.1 및 서브넷 마스크 255.255.255.0을 구성하고 네트워크 어댑터를 다른 장치에 연결하십시오. 아무것도 연결되어 있지 않은 간단한 스위치로 충분합니다. 그런 다음 ping 192.0.2.1이 Windows PC에서 실행 하면 Windows TCP / IP 스택이 에코 요청에 응답한다는 것을 알 수 있습니다. 정적 IPv4 주소에 192.0.2.0/24를 사용해서는 안된다는 것을 얼마나 많은 사람들이 알고 있습니까?
Mofi

1
여기 의견에 대한 논의에 따르면, 192.0.2.1이 그다지 완벽한 것은 아니며 일부는 127.255.255.255가 더 나은 선택이라고 제안합니다. 생각?
JLRishe

위의 게시물에서 언급 한 주석은 이제 제거되었지만 (NLN으로) 아마도 127.255.255.255기본적으로 이미 할당 된 Windows의 브로드 캐스트 루프백 주소 때문에 변경 사항에 동의합니다 route print. cmd 및 인쇄하는 IPv4 라우팅 테이블을 살펴보십시오).
Hoppeduppeanut

6

당신이 가지고있는 경우에 PowerShell을 시스템에, 당신은이 명령을 실행할 수 있습니다 :

powershell -command "Start-Sleep -s 1"

편집 : 비슷한 스레드에 대한 내 대답에서 사람들은 powershell을 시작하는 데 걸리는 시간이 기다리는 시간과 비교할 때 문제가 발생했습니다. 대기 시간의 정확성이 중요한 경우 (즉, 1 초 또는 2 초의 추가 지연이 허용되지 않는 경우) 다음 방법을 사용할 수 있습니다.

powershell -command "$sleepUntil = [DateTime]::Parse('%date% %time%').AddSeconds(5); $sleepDuration = $sleepUntil.Subtract((get-date)).TotalMilliseconds; start-sleep -m $sleepDuration"

이것은 windows 명령이 발행 된 시간이 걸리며, powershell 스크립트는 그 시간 이후 5 초가 될 때까지 휴면 상태입니다. 따라서 powershell이 ​​절전 시간보다 시작하는 데 시간이 덜 걸리는 한이 방법은 효과가 있습니다 (내 컴퓨터에서 약 600ms입니다).


6
timeout /t <seconds> <options>

예를 들어, 스크립트가 중단없는 2 초 대기를 수행하게하려면 다음을 수행하십시오.

timeout /t 2 /nobreak >NUL

이는 스크립트가 계속하기 전에 2 초 동안 대기 함을 의미합니다.

기본적으로 키 입력으로 인해 시간 초과가 중단되므로 /nobreak사용자가 대기를 중단 (취소)하지 못하게 하려면 스위치를 사용하십시오 . 또한 시간 초과는 사용자에게 대기 시간을 알리는 초당 알림을 제공합니다. 명령을로 파이프하여 제거 할 수 있습니다 NUL.

편집 :@martineau이 코멘트에 지적timeout명령은 위의 Windows 7 및에서만 사용할 수 있습니다. 또한이 ping명령은 프로세서보다 프로세서 시간을 덜 사용합니다 timeout. timeout그래도 ping'hack' 보다 더 읽기 쉽기 때문에 가능한 한 사용 하는 것이 좋습니다. 자세한 내용은 여기를 참조 하십시오 .


2
분명히이 명령은 Windows 7/2008 및 XP Resource Kit (및 8 / 8.1)에서만 사용할 수 있습니다. 소식통은 또한이 ping접근법이 더 적은 프로세서 시간을 사용 한다고 주장했다 .
martineau 2018 년

5

대기 파일을 배치 파일에 넣으십시오.

@ping 127.0.0.1 -n 11 -w 1000 > null

이것은 paxdiablo의 답변과 어떻게 다릅니 까?
Peter Mortensen

2
다르지는 않지만 여기에있는 답변은 여러 개의 병합 된 질문에서 온 것이므로 대답 할 때 모든 답변이 존재하지는 않았습니다.
브렌트 스튜어트

4

메모장에서 다음을 작성하십시오.

@echo off
set /a WAITTIME=%1+1
PING 127.0.0.1 -n %WAITTIME% > nul
goto:eof

이제 C : \ WINDOWS \ System32 폴더에 wait.bat로 저장 한 다음 기다릴 때마다 다음을 사용하십시오.

CALL WAIT.bat <whole number of seconds without quotes>

반복적으로 핑을 반복하고 각 핑 사이에 1 초를 기다린 다음 호출 프로그램으로 돌아갑니다. 무한 루프가 보이지 않지만 직접 테스트했습니다.
SuperKael

내 실수는 무한 루프가 없습니다. 그러나 다른 답변 중 하나에서 언급했듯이 ping한 번만 수행 하는 것이 더 좋으며 전체 재시도 옵션 -w Timeout대신 지연 시간 옵션을 밀리 초 단위로 사용하십시오 -n Count.
martineau

-w Timeout더 좋을지 모르지만 입력 한 시간보다 한 번 더 핑을 확인했습니다.
SuperKael

4

리소스 키트는 항상이 포함되어있다. 적어도 Windows 2000 이후.

또한 Cygwin 패키지에는 sleepPATH에 플롭이 있고 cygwin.dll(또는 그것이 무엇이든간에) 길을 포함합니다!


2
cygwin1.dll은 다른 버전의 버전과 평화롭게 공존하지 않습니다. 컴퓨터에 cygwin1.dll이 하나만 있어야합니다. 그렇지 않으면 이상한 오류가 발생합니다.
JesperE

어떤 리소스 키트? 하나 이상인 것 같습니다. 답변을 업데이트 할 수 있습니까?
피터 Mortensen

3

나는 Aacini의 답변을 좋아 한다 . 나는 하루를 처리하고 센티 초 ( %TIME%출력 H:MM:SS.CC) 를 처리 할 수 ​​있도록 추가했습니다 .

:delay
SET DELAYINPUT=%1
SET /A DAYS=DELAYINPUT/8640000
SET /A DELAYINPUT=DELAYINPUT-(DAYS*864000)

::Get ending centisecond (10 milliseconds)
FOR /F "tokens=1-4 delims=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, X=1%%D%%100, ENDING=((H*60+M)*60+S)*100+X+DELAYINPUT
SET /A DAYS=DAYS+ENDING/8640000
SET /A ENDING=ENDING-(DAYS*864000)

::Wait for such a centisecond
:delay_wait
FOR /F "tokens=1-4 delims=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, X=1%%D%%100, CURRENT=((H*60+M)*60+S)*100+X
IF DEFINED LASTCURRENT IF %CURRENT% LSS %LASTCURRENT% SET /A DAYS=DAYS-1
SET LASTCURRENT=%CURRENT%
IF %CURRENT% LSS %ENDING% GOTO delay_wait
IF %DAYS% GTR 0 GOTO delay_wait
GOTO :EOF

3

이 C # 절전 프로그램을 사용하고 있습니다. C #이 선호하는 언어 인 경우 더 편리 할 수 ​​있습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace sleep
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 1)
            {
                double time = Double.Parse(args[0]);
                Thread.Sleep((int)(time*1000));
            }
            else
            {
                Console.WriteLine("Usage: sleep <seconds>\nExample: sleep 10");
            }
        }
    }
}

3

파이썬 솔루션보다 훨씬 가벼운 것은 Perl one-liner입니다.

7 초 동안 잠자기 위해서는 이것을 BAT 스크립트에 넣으십시오 :

perl -e "sleep 7"

이 솔루션은 1 초의 해상도 만 제공합니다.

더 높은 해상도가 필요한 경우 CPAN의 Time :: HiRes 모듈을 사용하십시오. 그것은 제공하는 usleep()마이크로 자고있는 nanosleep()(두 함수는 인수의 정수 소요) 나노초에서 자고있다. 스택 오버플로 질문을 참조하십시오. Perl에서 밀리 초 동안 어떻게 자나요? 자세한 내용은.

나는 수년 동안 ActivePerl 을 사용 했습니다. 설치가 매우 쉽습니다.


2

또는 명령 행 Python (예 : 6 초 반) :

python -c "import time;time.sleep(6.5)"

더 짧지 만 이것은 허용되는 답변의 복제본입니다.
Peter Mortensen

@Peter Mortensen : 또한 배치 파일의 한 줄에 모든 것을 쉽게 넣을 수 있습니다.
martineau

2

"조금 기다리기"만한다면 ping 사용법 이 좋습니다. 네트워크가 작동하고 127.0.0.1에 아무런 응답이 없다는 사실과 같은 다른 기능에 의존하기 때문입니다. ;-) 실패했을 가능성은 적지 만 불가능하지는 않습니다 ...

지정된 시간을 정확하게 기다리고 있는지 확인하려면 sleep기능을 사용해야합니다 ( 기능은 CPU 전원을 사용하지 않거나 네트워크가 준비 될 때까지 대기하는 이점이 있습니다).

이미 잠자기 가능한 실행 파일을 찾는 것이 가장 편리한 방법입니다. Windows 폴더 또는 표준 경로의 다른 부분에 놓으면 언제든지 사용할 수 있습니다.

그렇지 않으면 컴파일 환경이있는 경우 쉽게 환경을 만들 수 있습니다. 이 Sleep기능은에서 ​​사용할 수 kernel32.dll있으므로 해당 기능 만 사용하면됩니다. :-) VB / VBA의 경우 소스 시작 부분에서 다음을 선언하여 절전 기능을 선언합니다.

private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (byval dwMilliseconds as Long)

C #의 경우 :

[DllImport("kernel32.dll")]
static extern void Sleep(uint dwMilliseconds);

절전 기능 (MSDN) 에서이 기능 (Windows 2000부터 사용 가능)에 대한 자세한 내용을 볼 수 있습니다 .

표준 C에서는 표준 sleep()라이브러리에 포함되어 있으며 Microsoft의 Visual Studio C에서는 Sleep()메모리가 제공되는 경우 함수의 이름이 입니다. ;-)이 두 개는 두 개의 이전 선언으로 밀리 초가 아닌 초 단위로 인수를 취합니다.


1
절전 모드는 .net 프레임 워크에서 사용할 수 있습니다. 스레드 클래스를 살펴보십시오. 예 : using System.Threading; .... Thread.Sleep (1000);
John Sibly

2
"ping 127.0.0.1"이 실패하면 "잠자기"보다 더 심각한 문제가 있습니다. 이것은 루프백 인터페이스입니다. RPC는 아마 화를 낼 것입니다.
Piskvor가 건물을 떠났습니다.

2

Windows 2000 이후의 모든 Windows 버전에서 작동하는 최상의 솔루션은 다음과 같습니다.

timeout numbersofseconds /nobreak > nul

XP Pro에서는 작동하지 않습니다 ...'timeout' is not recognized as an internal or external command, operable program or batch file.
martineau

1

pathping.exe는 2 초 미만으로 잠자기 할 수 있습니다.

@echo off
setlocal EnableDelayedExpansion 
echo !TIME! & pathping localhost -n -q 1 -p %~1 2>&1 > nul & echo !TIME!

.

> sleep 10
17:01:33,57
17:01:33,60

> sleep 20
17:03:56,54
17:03:56,58

> sleep 50
17:04:30,80
17:04:30,87

> sleep 100
17:07:06,12
17:07:06,25

> sleep 200
17:07:08,42
17:07:08,64

> sleep 500
17:07:11,05
17:07:11,57

> sleep 800
17:07:18,98
17:07:19,81

> sleep 1000
17:07:22,61
17:07:23,62

> sleep 1500
17:07:27,55
17:07:29,06

1

나는 이것에 깊은 인상을 받았다.

http://www.computerhope.com/batch.htm#02

choice /n /c y /d y /t 5 > NUL

기술적으로, 당신은 choice명령에 y 만 받아들이도록 지시하고 있습니다. 기본값은 y로, 5 초 안에 그렇게하고, 프롬프트를 표시하지 않으며, Linux에서 널 (null) 터미널과 같이 NUL에 말하는 것을 덤프합니다.


3
나는 여기에 나 자신을 반향시킬 것이다 : 나는 이것을 전혀 추천하지 않는다. 에서 CHOICE누군가가 Y.을 밀어하지 않는 한이 중단됩니다 있도록 참을성의 사람들은 때때로, 그 다음 선택은, 카운트 다운, 입력을 읽어 잘못된 입력에 대한 시스템 경고음을주고, 중단됩니다 않습니다 기다리는 동안 키를 안타 버전 나는 알고있다 그리고 그들이 Y를 누르면, 5를 기다리지 않고 바로 선택이 끝납니다. 또한,이 선택은 정말 이상한 Vista 문법을 사용하고 있습니다. 일반적인 선택 명령이 대신 사용 CHOICE /T:Y,5 > NUL됩니다. (이전 버전에는 / D 플래그가 없습니다.) Vista가있는 경우 TIMEOUT대신 사용하십시오.
스타일로 코딩하기

1

.vbs 파일을 사용하여 특정 시간 초과를 수행 할 수도 있습니다.

아래 코드는 .vbs 파일을 만듭니다. 이것을 래치 코드 상단에 넣으십시오.

echo WScript.sleep WScript.Arguments(0) >"%cd%\sleeper.vbs"

그런 다음 아래 코드는 .vbs를 열고 대기 시간을 지정합니다.

start /WAIT "" "%cd%\sleeper.vbs" "1000"

위의 코드에서 "1000"은 밀리 초 단위로 .vbs 파일로 전송되는 시간 지연 값입니다 (예 : 1000ms = 1 초). 이 부분을 원하는만큼 길게 변경할 수 있습니다.

아래 코드는 .vbs 파일을 삭제 한 후 삭제합니다. 이것을 배치 파일의 끝에 넣으십시오.

del /f /q "%cd%\sleeper.vbs"

그리고 여기 코드가 모두 정리되어 있으므로 쉽게 복사 할 수 있습니다.

echo WScript.sleep WScript.Arguments(0) >"%cd%\sleeper.vbs"
start /WAIT "" "%cd%\sleeper.vbs" "1000"
del /f /q "%cd%\sleeper.vbs"

1

Windows Vista에는 TIMEOUTSLEEP 명령이 있지만 Windows XP 또는 Windows Server 2003에서 사용하려면 Windows Server 2003 리소스 도구 키트 가 필요합니다 .

다음 은 수면 대안에 대한 좋은 개요입니다 (핑 방법은 모든 Windows 시스템에서 작동하므로 가장 널리 사용됩니다).하지만 W32TM(시간) 명령을 사용하는 ( 적어도) 언급되지 않은 방법이 있습니다 .

w32tm /stripchart /computer:localhost /period:1 /dataonly /samples:N  >nul 2>&1

N을 일시 정지하려는 초로 바꾸어야합니다. 또한 전제 조건없이 모든 Windows 시스템에서 작동합니다.

Typeperf도 사용할 수 있습니다 :

typeperf "\System\Processor Queue Length" -si N -sc 1 >nul

mshta 및 javascript 사용 (1 초 미만의 절전 모드로 사용할 수 있음) :

start "" /wait /min /realtime mshta "javascript:setTimeout(function(){close();},5000)"

이것은 훨씬 더 정확해야합니다 (1 초 동안 기다리십시오) .net.

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal
::del %~n0.exe /q /f
::
:: For precision better call this like
:: call waitMS 500
:: in order to skip compilation in case there's already built .exe
:: as without pointed extension first the .exe will be called due to the ordering in PATEXT variable
::
::
for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)

if not exist "%~n0.exe" (
    "%jsc%" /nologo /w:0 /out:"%~n0.exe" "%~dpsfnx0"
)


%~n0.exe %*

endlocal & exit /b %errorlevel%


*/


import System;
import System.Threading;

var arguments:String[] = Environment.GetCommandLineArgs();
function printHelp(){
    Console.WriteLine(arguments[0]+" N");
    Console.WriteLine(" N - milliseconds to wait");
    Environment.Exit(0);    
}

if(arguments.length<2){
    printHelp();
}

try{
    var wait:Int32=Int32.Parse(arguments[1]);
    System.Threading.Thread.Sleep(wait);
}catch(err){
    Console.WriteLine('Invalid Number passed');
    Environment.Exit(1);
}

1

' 수면 을 달성하는 많은 방법이 있습니다cmd / batch에서 ' .

내가 가장 좋아하는 것 :

TIMEOUT /NOBREAK 5 >NUL 2>NUL

출력없이 5 초 동안 콘솔이 중지됩니다.

가장 많이 사용:

ping localhost -n 5 >NUL 2>NUL

localhost5 번 연결을 시도합니다 . 컴퓨터에서 호스트되기 때문에 항상 호스트에 도달하므로 1 초마다 새로운 시도를합니다. 그만큼-n플래그는 스크립트가 연결을 시도하는 횟수를 나타냅니다. 이 경우 5이므로 5 초 동안 지속됩니다.

마지막 것의 변형 :

ping 1.1.1.1 -n 5 >nul

이 스크립트에는 마지막 스크립트와 비교하여 약간의 차이가 있습니다. 전화를 시도하지 않습니다 localhost. 대신 1.1.1.1매우 빠른 웹 사이트 에 연결을 시도합니다 . 인터넷에 연결되어있는 경우에만 5 초 동안 작업이 지속됩니다 . 그렇지 않으면 작업을 완료하는 데 약 15 분 정도 소요 됩니다. 이 방법을 사용하지 않는 것이 좋습니다.

ping 127.0.0.1 -n 5 >nul

이것은 예제 2와 가장 동일합니다 (가장 많이 사용됨). 또한 다음을 사용할 수도 있습니다.

ping [::1] -n 5 >nul

대신 IPv6 localhost버전을 사용합니다 .

이 작업을 수행하는 많은 방법이 있습니다. 그러나 Windows Vista 및 이후 버전의 경우 방법 1과 이전 버전의 OS에서 가장 많이 사용되는 방법 (방법 2)을 선호합니다.


0

제목 표시 줄에 PAUSE 메시지를 넣어서 멋지게 만들 수 있습니다.

@ECHO off
SET TITLETEXT=Sleep
TITLE %TITLETEXT%
CALL :sleep 5
GOTO :END
:: Function Section
:sleep ARG
ECHO Pausing...
FOR /l %%a in (%~1,-1,1) DO (TITLE Script %TITLETEXT% -- time left^
 %%as&PING.exe -n 2 -w 1000 127.1>NUL)
EXIT /B 0
:: End of script
:END
pause
::this is EOF

0

이것은 Windows XP SP3 및 Windows 7에서 테스트되었으며 CScript를 사용합니다. 나는 ""프롬프트를 피하기 위해 안전 요원을 두었다. ( /q위험 할 것이다)

1 초 정도 기다립니다 :

sleepOrDelayExecution 1000

500ms 기다린 후 다음을 수행하십시오.

sleepOrDelayExecution 500 dir \ /s

sleepOrDelayExecution.bat :

@echo off
if "%1" == "" goto end
if NOT %1 GTR 0 goto end
setlocal
set sleepfn="%temp%\sleep%random%.vbs"
echo WScript.Sleep(%1) >%sleepfn%
if NOT %sleepfn% == "" if NOT EXIST %sleepfn% goto end
cscript %sleepfn% >nul
if NOT %sleepfn% == "" if EXIST %sleepfn% del %sleepfn%
for /f "usebackq tokens=1*" %%i in (`echo %*`) DO @ set params=%%j
%params%
:end

0

다른 사람들이 타사 프로그램 (Python, Perl, custom app 등)을 제안하고 있기 때문에 다른 옵션은 http://gnuwin32.sourceforge.net/packages/coreutils.htm 에있는 Windows 용 GNU CoreUtils입니다. .

배포를위한 2 가지 옵션 :

  1. 전체 패키지 (CoreUtils, 종속성, 문서 등의 전체 제품군 포함)를 설치하십시오.
  2. 'sleep.exe'바이너리와 필요한 종속성 만 설치하십시오 (종속성을 얻으려면 depend.exe를 사용하십시오).

CoreUtils를 배포하면 얻을 수있는 이점 중 하나는 스크립팅에 도움이되는 여러 가지 다른 프로그램을 추가로 얻을 수 있다는 것입니다 (Windows 배치는 많이 필요합니다).

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