Спать в пакетном файле - PullRequest
139 голосов
/ 03 октября 2008

При написании командного файла для автоматизации чего-либо на коробке Windows, мне нужно было приостановить его выполнение на несколько секунд (обычно в цикле тестирования / ожидания, ожидая запуска процесса). В то время лучшее решение, которое я мог найти, использует ping (я не шучу) для достижения желаемого эффекта. Я нашел лучшее описание этого здесь , которое описывает вызываемый "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 предоставляет Unix-подобную команду сна (наконец-то!). В то же время, для тех из нас, кто все еще использует Windows XP, Windows 2000 или (к сожалению) Windows NT , есть ли лучший способ?

Я изменил сценарий sleep.py в принятом ответе , так что по умолчанию он равен одной секунде, если в командной строке не передано никаких аргументов:

import time, sys

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

Ответы [ 30 ]

214 голосов
/ 30 марта 2011

Команда 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.
21 голосов
/ 28 июля 2011

Использование описанного выше метода ping - это то, как я делаю это, когда не могу (или не хочу) добавлять дополнительные исполняемые файлы или устанавливать любое другое программное обеспечение.

Вы должны пропинговать что-то, чего нет, и использовать флаг -w, чтобы он потерпел неудачу по прошествии этого времени, а не пинговать что-то, что там (как localhost) -n раз. Это позволяет вам обрабатывать время менее секунды, и я думаю, что это немного более точно.

1010 *, например *

(проверить, что 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
15 голосов
/ 03 октября 2008

SLEEP.exe включено в большинство комплектов ресурсов, например Windows Server 2003 Resource Kit , который также можно установить в Windows XP.

Usage:  sleep      time-to-sleep-in-seconds
        sleep [-m] time-to-sleep-in-milliseconds
        sleep [-c] commited-memory ratio (1%-100%)
15 голосов
/ 24 июля 2011

Я не согласен с ответами, которые нашел здесь.

Я использую следующий метод, полностью основанный на возможностях 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

Вы также можете вставить день в расчет, чтобы метод также работал, когда интервал задержки превышает полночь.

13 голосов
/ 03 октября 2008

Если у вас установлен Python или вы не против его установить (он также используется и в других целях :), просто создайте следующий скрипт sleep.py и добавьте его где-нибудь в своем PATH:

import time, sys

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

Это позволит делать паузы длительностью менее секунды (например, 1,5 с, 0,1 и т. Д.), Если у вас есть такая необходимость. Если вы хотите назвать его как sleep, а не sleep.py, вы можете добавить расширение .PY в переменную среды PATHEXT. В Windows XP вы можете отредактировать его в:

Мой компьютер → Свойства (меню) → Дополнительно (вкладка) → Переменные среды (кнопка) → Системные переменные (рамка)

ОБНОВЛЕНИЕ: Команда timeout, доступная в Windows Vista и более поздних версиях, должна быть используемой командой, как описано в другом ответе на этот вопрос.

13 голосов
/ 03 октября 2008

Я столкнулся с подобной проблемой, но я просто выбил очень короткое консольное приложение 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 голосов
/ 28 ноября 2009

При сбое сервера, был задан похожий вопрос , решение было:

choice /d y /t 5 > nul
9 голосов
/ 28 ноября 2009

Можно использовать слой 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");
8 голосов
/ 26 марта 2011

В зависимости от ваших потребностей в совместимости, используйте ping:

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

например. чтобы подождать 5 секунд, используйте

ping -n 6 localhost >nul 2>&1

или в Windows 7 или более поздней версии используйте timeout:

timeout 6 >nul
8 голосов
/ 20 августа 2009

Вы можете использовать ping:

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

Это будет ждать 10 секунд.

Причина, по которой вы должны использовать 11, заключается в том, что первый пинг гаснет немедленно, а не через одну секунду. Число всегда должно быть на единицу больше, чем количество секунд, которое вы хотите подождать.

Имейте в виду, что цель -w - не ждать одну секунду. Это гарантирует, что вы не будете ждать больше , чем одна секунда в случае возникновения проблем с сетью. ping сам отправит один ICMP-пакет в секунду. Это, вероятно, не требуется для localhost, но старые привычки сильно умирают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...