Спать в пакетном файле - 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 ]

2 голосов
/ 08 января 2012

Или командная строка Python, например, на 6 с половиной секунд:

python -c "import time;time.sleep(6.5)"
2 голосов
/ 29 июля 2009

Еще более легкий, чем решение Python - Perl один вкладыш.

Чтобы поспать семь секунд, введите в сценарий BAT:

perl -e "sleep 7"

Это решение обеспечивает разрешение только в одну секунду.

Если вам нужно более высокое разрешение, используйте Time :: HiRes модуль из CPAN. Это обеспечивает usleep(), который спит в микросекунды и nanosleep(), который спит в наносекундах (обе функции принимают только целочисленные аргументы). Увидеть Вопрос переполнения стека Как мне спать на миллисекунде в Perl? для получения дополнительной информации.

Я использовал ActivePerl в течение многих лет. Это очень легко установка.

1 голос
/ 01 февраля 2017

pathping.exe может спать менее секунды.

@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 голос
/ 21 января 2014

Вы также можете использовать файл .vbs для выполнения определенных таймаутов:

Код ниже создает файл .vbs. Поместите это в верхней части кода rbatch:

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

Затем приведенный ниже код открывает .vbs и указывает, как долго ждать:

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

В приведенном выше коде «1000» - это значение временной задержки, которая будет отправлена ​​в файл .vbs в миллисекундах, например, 1000 мс = 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 голос
/ 08 января 2014

Начиная с Windows Vista, у вас есть команды TIMEOUT и SLEEP , но для их использования в Windows XP или Windows Server 2003 вам потребуется Windows Server 2003 ресурсный набор инструментов .

Здесь у вас есть хороший обзор альтернатив сна (подход ping наиболее популярен, так как он будет работать на каждой машине с Windows), но есть (по крайней мере) один, не упомянутый, который (ab) использует команда 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
1 голос
/ 28 апреля 2011

Я впечатлен этим:

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

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

Технически, вы говорите команде choice принять только y. По умолчанию используется значение y, чтобы сделать это за 5 секунд, не выводить подсказки и выводить все, что говорит NUL (например, нулевой терминал в Linux).

0 голосов
/ 13 ноября 2018

Поскольку другие предлагают сторонние программы (Python, Perl, пользовательские приложения и т. Д.), Другой вариант - GNU CoreUtils для Windows, доступный по адресу http://gnuwin32.sourceforge.net/packages/coreutils.htm.

2 варианта развертывания:

  1. Установить полный пакет (который будет включать полный набор CoreUtils, зависимости, документацию и т. Д.).
  2. Устанавливать только двоичный файл 'sleep.exe' и необходимые зависимости (для получения зависимостей используйте зависящий от.exe файл).

Одним из преимуществ развертывания CoreUtils является то, что вы дополнительно получите множество других программ, которые полезны для сценариев (пакет Windows оставляет желать лучшего).

0 голосов
/ 28 июля 2014
ping -n X 127.0.0.1 > nul

Заменить X на количество секунд + 1.

Например, если вам нужно подождать 10 секунд, замените X на 11. Для ожидания 5 секунд используйте 6.

Читайте предыдущие ответы за миллисекунды.

0 голосов
/ 29 января 2014

Это было проверено на Windows XP SP3 и Windows 7 и использует CScript. Я поставил несколько безопасных предохранителей, чтобы избежать подсказок. (/q было бы опасно)

Подождите одну секунду:

sleepOrDelayExecution 1000

Подождите 500 мс, а затем выполните команду после:

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 голосов
/ 05 сентября 2013

Вы можете получить фантазию, поместив сообщение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...