(MS-DOS) Временные задержки - PullRequest
       44

(MS-DOS) Временные задержки

3 голосов
/ 21 апреля 2009

Я нашел несколько способов вызвать задержку, такую ​​как пинг и dirs. Хотя ни один из них не является действительно точным, существует ли какой-либо правильный способ вызвать задержку?

Я слышал о некоторых вещах, хотя они не работают на всех компьютерах, ни на моей Windows XP, ни на Windows NT в колледже.

Требуются годы, чтобы просмотреть все файлы в Google, чтобы найти хороший ответ, и, поскольку я еще не нашел вопрос о переполнении стека, я подумал, что было бы неплохо просто создать вопрос самостоятельно;)

Ответы [ 5 ]

6 голосов
/ 21 апреля 2009

Sleep

Это позволит вам сделать это.

5 голосов
/ 21 апреля 2009

<warning>This is a hack</warning>

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

Насколько я знаю, это единственный надежный способ сделать это в DOS.

2 голосов
/ 21 апреля 2009

Если у вас нет возможности отправить другую программу вместе с командным файлом, используйте DEBUG , чтобы написать команду сна на лету и выполнить ее.

EDIT: Приведенный выше ответ был довольно сложным. Я бы не запустил пакетный файл, в котором была какая-то хитрость отладки. Я считаю, что традиционный способ использовать задержку в командном файле - это CHOICE запятая.

type nul|choice /c:y /t:y,nn > nul

Что, конечно, не работает в XP, так как это было бы WAAYY слишком удобно.

0 голосов
/ 28 сентября 2009

Можно достичь точности в несколько миллисекунд, в зависимости от скорости вашей машины.

Я только что закончил создание такого пакета, и хотя я не буду делиться с вами настоящим кодом, я дам вам несколько советов:

  1. Используйте переменную% time% и делитесь на подстроки (без ":" и ".") - одна подстрока будет получать секунды, другая - минуты (вы можете добавить часы, для задержек более часа и даже включить дату)

  2. Используйте set / A, чтобы преобразовать переменные времени в 1 целое число, представляющее количество секунд, прошедших с округленного часа (X: 00: 00.00). Добавьте к этому введенную задержку (в секундах).

  3. Создайте короткий цикл, сравнивая значение объединенной переменной (объяснено в разделе 2) с текущим временем (необходимо пересчитать текущее объединенное значение min + sec, внутри этого цикла) и выходя из цикла, когда совпадение верно.

Здесь одно серьезное исправление - вам нужно будет обрезать любые предшествующие нули до переменных, которые собираются вычисляться с помощью команды "set / A". Я заметил, что оценщик консоли (для этой команды) возвращает ошибку, когда используется целое число с предшествующим 08 или 09 (или просто 08 или 09).

Примечание: Это будет работать только с включенными расширениями команд. Чтобы проверить это, используйте следующее в начале процедуры:

verify other 2>nul
setlocal enableextensions
if errorlevel 1 goto err

А затем добавьте подпрограмму обработчика ошибок с именем "err".

Если вы хотите продолжить пакет в том же файле, используйте «endlocal» после подпрограммы зацикливания.

Кстати, это относится ТОЛЬКО к Windows XP с пакетом обновления 2 или 3.

0 голосов
/ 21 апреля 2009

"... правильный путь ...."

вы не можете сделать это в DOS.

...