Сплять у пакетному файлі


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 пропонує команду сну, схожу на 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)

Сторінка завантаження Microsoft із набору ресурсів Windows 2003 вказує, що вона також працює для XP. Боюся, немає іншого вибору, крім використання «зовнішньої» утиліти для очікування: нічого подібного немає вбудованого в командний процесор XP.
ГерГ

Комплект ресурсів сервера 2003 працює з Windows XP (і, напевно, з w2k)
Мартін Бекетт

Я зіткнувся з тією ж проблемою і в минулому, і сам використовував пінг (із зауваженням вище чітко підтверджуючи, що я розумію, що це дурно :)).
Джек Лев


2
У вас є пара варіантів - емуляція сну за допомогою pingкоманди або завантаження набору ресурсів Windows, який включає в себе sleepкоманду. Більше деталей тут: Пакетний файл командування SLEEP
Руду

Відповіді:


14

ОНОВЛЕННЯ

timeoutКоманда, доступна з Windows Vista і далі йде команда використовується, як описано в іншому відповіді на це питання. Далі йде стара відповідь.

Стара відповідь

Якщо у вас встановлений Python, або не проти встановити його (він також має інші можливості :), просто створіть такий сценарій sleep.py і додайте його десь у вашому PATH:

import time, sys

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

Це дозволить робити паузи другої секунди (наприклад, 1,5 сек, 0,1 і т.д.), якщо у вас є така потреба. Якщо ви хочете викликати це як sleepшвидше sleep.py, тоді ви можете додати .PYрозширення до змінної середовища PATHEXT. У Windows XP ви можете редагувати його в:

Мій комп'ютер → Властивості (меню) → Додатково (вкладка) → Змінні середовища (кнопка) → Змінні системи (кадр)


32
навіщо нам писати сценарій у python, коли запитується пакетне рішення? Як розширення шляху може вирішити проблему, що для користувачів Windows не встановлено інтерпретатора python? Дякую.
Валь

6
Заради портативності, я думаю, цього рішення слід уникати, оскільки існують ідеальні альтернативи.
Гра Гра Двомісний

1
Такий підхід міг забезпечити вирішення минулого, але власне рішення, описане @Blorgbeard, безумовно, це саме шлях.
Майк

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

Я мав на увазі випадки, коли у вас взагалі немає консолі, наприклад, коли пакетний файл запускається у фоновому режимі за допомогою вилки з якогось іншого процесу, cgtaw cgwtіn або віддаленої команди ssh тощо.
simpleuser

1
О так, я знаю. Приклад, який я наводив, полягав лише в тому, щоб продемонструвати помилку :)
Blorgbeard вийшов

3
Посилання до документації timeout, яка додається @Cristian Ciupitu, частково неправильно - Windows XP не має цю команду.
мартіно

1
@HelloWorld, що звучить як проблема з вашим% PATH%
Blorgbeard вийшов

21

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

Вам слід писати щось, чого там немає, і використовувати -wпрапор так, щоб він вийшов з ладу через цей проміжок часу, не пінгуючи щось, що є там (наприклад, localhost) -n. Це дозволяє обробляти час менше секунди, і я думаю, це трохи точніше.

напр

(перевірити, що 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 секунд, а близько деяких мс.
dhcgn

16

SLEEP.exeвходить до більшості наборів ресурсів, наприклад, Комплект ресурсів Windows Server 2003, який також можна встановити на Windows XP.

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

15

Я не згоден з відповідями, які я знайшов тут.

Я використовую наступний метод, повністю заснований на можливостях Windows XP, щоб зробити затримку в пакетному файлі:

ДОСТАВИТИ.БАТ:

@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
Це повинно бути точним, але це досить інтенсивний шлях для процесора. Зазвичай ви хочете реалізацію інтерфейсу, щоб процес не споживав цикли процесора, поки він чекає. Це не повинно бути проблемою для нечастого короткого очікування, як це, мабуть, стосується більшості пакетних ситуацій. Але безперервно запущений процес з тривалими очікуваннями може негативно вплинути на продуктивність системи.
dbenham

4
При використанні системного годинника точність становить одну секунду. Якщо вказано 2 секунди, затримка може бути між 2 секундами і 3 секундами (фактично 2,99999 ... секунд).
Пітер Мортенсен

Що робити, якщо зараз час 7:59:59, і ви хочете почекати 7 секунд? Схоже, це не враховує.
ashes999

Це забирає більше процесорного часу, ніж рахує системний час. Крім того, ви виконуєте арифметичні операції з вісімковими числами, оскільки хвилин і секунд менше 10 відображаються з провідним 0 в TIMEкоманді.
Андреас

2
@mrt: Проблема полягає в тому, що ви %TIME%використовуєте кому, щоб розділити центрисекунди, а не крапка! Просто додайте DELIMS=:.,"
коску

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
FYI: Вибір не включений у Windows XP. Це було в Windows 9x, його видаляли з XP і додавали назад для Vista далі.
Девін Берк

7
Я взагалі цього не рекомендував. Принаймні у всіх CHOICEверсіях, які я знаю, якщо хтось натискає кнопку під час очікування, що інколи нетерплячі люди, тоді вибір зареєструє вхід, видасть системний звуковий сигнал для поганого введення та зупинить таймер зворотного відліку, а це означає, що він зависне там, якщо вони не натискають N або Y. І якщо вони просто трапляються на один з цих двох, то вибір закінчується саме там, а не чекати 5. Також для цього вибору використовується дійсно дивний синтаксис Vista. Усі команди звичайного вибору замість цього використовували б CHOICE /T:Y,5 > NUL. У /Dстарих версіях немає прапора.
Кодування зі стилем

1
На додаток до цього, принаймні команди CHOICE, які я знаю, мають різні кнопки за замовчуванням так / ні, залежно від мови, до якої він увійшов, тому, якщо вам трапляється покластись на вибір [Y, N] за замовчуванням, а не чітко вказувати його /C:YNчи просто /C:Y, це не спрацює, якщо у когось, скажімо, є шведська команда вибору, яка, ймовірно, виконає [J, N] за замовчуванням. Тож це заграє у всіляких клопотах.
Кодування зі стилем

1
@Coding Випробував це в Win7, і якщо користувач натисне кнопку, він подасть звуковий сигнал, проте він все ще закінчиться через 5 секунд після натискання користувачем кнопки. Отже, якщо користувач продовжує натискати клавіші, він ніколи не закінчиться. Також у моєму випадку, коли я цим скористався, я вважаю, що приховати консоль, щоб користувач не міг натиснути кнопку. У цій системі не було доступу до Python, не було доступу до мого власного exe в системі (як це пропонується в деяких інших відповідях), я був досить обмежений у тому, що міг зробити. Отже, що б ти порадив?
mlsteeves

@mlsteeves У різних Windows, DOS тощо є інша команда вибору, і як зазначалося, вона зазвичай не доступна в Xp. Багато команд вибору мають дуже різну поведінку, а деякі навіть мають різний синтаксис. Я, як правило, використовую команду ping, коли мені потрібен сон. Це некрасиво, але надійно.
Кодування зі стилем

9

Ви можете використовувати шар WSH - скрипту Windows і цей файл JavaScript.js:

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

1
Хост Windows Scripting Host можна відключити за допомогою групової політики.
Джої

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це лише кількість разів для пінг, і час за замовчуванням між пінгами - це секунда.
Joey

8

Ви можете використовувати ping:

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

Він зачекатиме 10 секунд.

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

Майте на увазі, що мета цього проекту -w- не чекати секунди. Це потрібно, щоб ви зачекали не більше однієї секунди у випадку виникнення проблем з мережею. pingсамостійно надсилатиме один пакет ICMP в секунду. Це, мабуть, не потрібно для місцевого господаря, але старі звички важко вмирають.


не рекомендується використовувати це для критичної обробки в режимі реального часу. оскільки використовується команда PING, можливо, цей пакетний файл WAIT може працювати протягом декількох мілісекунд
Wael Dalloul

12
@Wael, якщо ви говорите про очікування на межі однієї секунди, кілька мілісекунд буде неважливим. І якщо ви використовуєте cmd.exe для реального часу, ви заслуговуєте на все, що отримуєте :-)
paxdiablo

-w - значення тайм-ауту. Це кількість мілісекунд, щоб чекати відповіді ... а не кількість часу, щоб чекати між пінгами.
quux

@quux, ніде я не заявляв, що це -wчас очікування (хоча, я можу визнати, деякі можуть зробити висновок, що через мою відсутність ясності) він фактично використовується для обмеження часу циклу, коли є мережеві проблеми, через які кожен цикл займе більше, ніж його виділено другий. Я додав абзац до кінця, щоб уточнити це.
paxdiablo

Проблема полягає в тому, що якщо пінг повернеться швидше , ви можете не зачекати одну повну секунду між пінгами. тож ваш цикл очікування закінчиться швидше, ніж ви думали, що це буде
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параметра.
Пітер Мортенсен

Однак я її виміряв (використовуючи 100 пінг). Якщо я використовую -n 3 -w 124, фактичний час точно (3 + 1) * (124 + 1) = 4 * 125 = 500 мс. Час роботи напрочуд стабільний, точний до роздільної здатності 10 мс під час зчитування (за допомогою запиту CMD з часом) - і базове дозвіл, безумовно, краще, ніж 10 мс (на це не впливає звичайне дозвіл галочки 16 мс).
Пітер Мортенсен

@mafu Це те, що 192.0.2.0/24 не слід використовувати, не означає, що його не можна використовувати, і тому насправді не гарантується, що відповіді на запит ехо не буде. Наприклад, налаштуйте для будь-якого ПК Windows статичну адресу IPv4 192.0.2.1 та маску підмережі 255.255.255.0 та підключіть мережевий адаптер до будь-якого іншого пристрою. Досить простого перемикача, на якому нічого більше не підключено. Потім запустіть ping 192.0.2.1на цьому ПК з Windows, і видно, що стек Windows TCP / IP відповідає на запити ехо. Скільки людей знають, що 192.0.2.0/24 не слід використовувати для статичної адреси IPv4?
Мофі

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 -command "$sleepUntil = [DateTime]::Parse('%date% %time%').AddSeconds(5); $sleepDuration = $sleepUntil.Subtract((get-date)).TotalMilliseconds; start-sleep -m $sleepDuration"

Це займає час, коли була видана команда Windows, і сценарій повноважень працює до 5 секунд після цього часу. Тож поки у PowerShell потрібно менше часу, ніж у вашому режимі сну, такий підхід буде працювати (на моїй машині це близько 600 мс).


6
timeout /t <seconds> <options>

Наприклад, щоб змусити сценарій виконувати безперебійне 2-секундне очікування:

timeout /t 2 /nobreak >NUL

Що означає, що сценарій зачекатиме 2 секунди, перш ніж продовжити.

За замовчуванням натискання клавіші перерве час очікування, тому використовуйте /nobreakперемикач, якщо ви не хочете, щоб користувач міг перервати (скасувати) очікування. Крім того, тайм-аут надасть сповіщення за секунду, щоб повідомити користувача про те, як довго чекати; це можна видалити, відвівши команду до NUL.

редагувати: Як в коментарях вказує @martineau , timeoutкоманда доступна лише в Windows 7 і вище. Крім того, pingкоманда використовує менше процесорного часу, ніж timeout. Я все ще вірю в використання, timeoutде це можливо, оскільки це читабельніше, ніж ping"хак". Детальніше читайте тут .


2
Мабуть, ця команда доступна лише в Windows 7/2008 та XP Resource Kit (і, можливо, 8 / 8.1). Джерело також стверджує, що pingпідхід використовує менше процесорного часу.
мартіно

5

Просто помістіть це у свій пакетний файл, куди потрібно чекати.

@ping 127.0.0.1 -n 11 -w 1000 > null

Чим це відрізняється від відповіді paxdiablo?
Пітер Мортенсен

2
Це не відрізняється, але відповіді тут приведені з декількох об'єднаних питань, тому не всі відповіді існували, коли я відповідав.
Брент Стюарт

4

У Блокноті напишіть:

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

Тепер збережіть як wait.bat у папці C: \ WINDOWS \ System32, тоді, коли потрібно чекати, використовуйте:

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

Він записує себе неодноразово, чекаючи секунди між кожним ping, а потім повертається до програми виклику, я не бачу нескінченного циклу, але я перевірив це сам.
SuperKael

Моя помилка, немає нескінченного циклу. Однак, як згадується в одній з інших відповідей , краще pingщось робити не один раз, а використовувати -w Timeoutваріант для часу затримки в мілісекундах, а не -n Countвесь варіант кількості повторних спроб.
мартіно

-w Timeoutможе бути і краще, але я переконався, що це пінг один раз, ніж час, що вводиться.
SuperKael

4

Набір ресурсів завжди включав це. Принаймні з Windows 2000.

Крім того, пакет Cygwin має sleep- plop, який входить у ваш PATH, і включає в себе cygwin.dll(або як воно ще називається) і шлях!


2
Зауважте, що cygwin1.dll не мирно співіснує з різними версіями себе. Вам краще мати один і лише один cygwin1.dll на своїй машині, інакше ви отримаєте дивні збої.
JesperE

Який набір ресурсів? Здається, їх є більше. Чи можете ви оновити свою відповідь?
Пітер Мортенсен

3

Мені подобається відповідь Аакіні . Я додав до нього обробляти день, а також дозволити йому обробляти центрисекунди ( %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

Ще легше, ніж рішення Python, - це однокладова Perl.

Щоб спати сім секунд, покладіть це на сценарій BAT:

perl -e "sleep 7"

Це рішення забезпечує лише дозвіл на одну секунду.

Якщо вам потрібна більш висока роздільна здатність, використовуйте модуль Time :: HiRes від CPAN. Він забезпечує, usleep()який спить у мікросекундах, а nanosleep()який спить у наносекундах (обидві функції приймають лише цілі аргументи). Див. Запитання про переповнення стека. Як мені спати мілісекунди в Perl? для отримання детальної інформації.

Я використовував ActivePerl багато років. Це дуже просто встановити.


2

Або командний рядок Python, наприклад, протягом 6 з половиною секунд:

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

Хоча і коротше, це дублікат прийнятої відповіді.
Пітер Мортенсен

@ Peter Mortensen: Це також дозволяє легко розмістити все в один рядок пакетного файлу.
мартіно

2

Використання пінгу добре, доки ви просто хочете "трохи почекати". Це оскільки ви залежать від інших функцій, таких як робота вашої мережі, і того, що на 127.0.0.1 нічого не відповідає. ;-) Можливо, це не дуже ймовірно, що не вдасться, але це неможливо ...

Якщо ви хочете бути впевнені, що вас чекає точно вказаний час, слід скористатися sleepфункціоналом (який також має перевагу в тому, що він не використовує живлення процесора або чекає, коли мережа стане готова).

Знайти вже зроблений для сну виконаний варіант - найзручніший спосіб. Просто занесіть його у папку 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);

Тут ви дізнаєтесь більше про цю функціональність (доступна з Windows 2000) у режимі сну (MSDN).

У стандартному C, що sleep()входить до стандартної бібліотеки, а у Visual Studio C Microsoft функція називається Sleep(), якщо мені служить пам'ять. ;-) Ці двоє приймають аргумент за секунди, а не за мілісекунди, як дві попередні декларації.


1
Сон доступний у рамках .net - перегляньте клас потоку, наприклад: використовуючи System.Threading; .... Нитка.Спляча (1000);
Джон Сіблі

2
Якщо "ping 127.0.0.1" виходить з ладу, у вас є більш серйозні речі, ніж "сон", щоб турбуватися - це інтерфейс зворотного зв'язку, і все, що RPC, ймовірно, зійде з розуму.
Пісквор вийшов з будівлі

2

Найкращим рішенням, яке повинно працювати на всіх версіях Windows після Windows 2000, було б:

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 може спати менше секунди.

@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 секунд, не робити запитів і не скидати все, що він каже NUL (наприклад, нульовий термінал в Linux).


3
Я тут відлуню собі: я цього взагалі не рекомендую. У CHOICEверсіях, які я знаю, якщо хтось натискає клавішу під час очікування, що іноді роблять нетерплячі люди, тоді вибір буде читати вхід, подавати звуковий сигнал для поганого введення та зупиняти відлік часу, тому він зависне, якщо вони не натиснуть Y. І якщо вони просто натискають Y, то вибір закінчується саме там, а не чекати 5. Також для цього вибору використовується дійсно дивний синтаксис Vista. Команди звичайного вибору замість цього використовуються CHOICE /T:Y,5 > NUL. (У старих версіях немає прапора / D.) А якщо у вас Vista, використовуйте TIMEOUTзамість цього.
Кодування зі стилем

1

Ви також можете використовувати .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

У Windows Vista у вас є команди TIMEOUT і SLEEP , але для їх використання в Windows XP або Windows Server 2003 вам знадобиться набір інструментів для ресурсів Windows Server 2003 .

Тут ви маєте хороший огляд альтернатив сну (підхід ping є найпопулярнішим, оскільки він працюватиме на кожній машині Windows), але є (принаймні) той, який не згадується, який (ab) використовує команду W32TM(Time Service):

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 (можна використовувати для сну за секунду):

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

Це має бути ще більш точним (для очікування менше секунди) - самокомпілюючий виконуваний файл, спираючись на .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 разів. Оскільки він розміщений на вашому комп’ютері, він завжди охопить хост, тому щосекунди він намагатиметься нового щосекунди. -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

Для цього використовується localhostверсія IPv6 .

Існує маса методів виконання цієї дії. Однак я віддаю перевагу способу 1 для Windows Vista та пізніших версій, а найбільш використовуваний метод (метод 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було б небезпечно)

Зачекайте одну секунду:

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

Оскільки інші пропонують програми сторонніх виробників (Python, Perl, користувацькі програми тощо), інший варіант - це GNU CoreUtils для Windows, доступний за адресою http://gnuwin32.sourceforge.net/packages/coreutils.htm .

2 варіанти розгортання:

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

Однією з переваг розгортання CoreUtils є те, що ви додатково отримаєте безліч інших програм, які корисні для сценаріїв (пакет Windows залишає бажати кращого).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.