Как зациклить выполнение команды в bat-файле?

Описание

Иногда необходимо создать bat-файл, который будет запускать некую команду через определённый интервал времени. Для решения этой задачи можно воспользоваться Планировщиком и часто запускать bat-файл из него, а можно создать в bat-файле цикл с паузой.

Cmd цикл с задержкой

Продолжение…

Особенности, которые распространяются на циклы FOR

0) Если нужно записать в наборе несколько команд, то используем:

а) знаки амперсанда &, если мы хотим записать все в одну строку:

FOR /L %%a IN (1,1,10) DO echo Найден файл:& echo %%a

б) знаки скобок, если хотим разбить команды в несколько строк для наглядности и удобства:

FOR /L %%a IN (1,1,10) DO (
echo Найден файл:
echo %%a
)

1) Пустые строки в содержимом файлов и выводе команд игнорируются.

2) Если предполагается получение пустого токена, остальные токены смещаются.
К примеру,
имеем файл с содержимым:

file.txt написал(а):

Применим команду:

FOR /F “tokens=1,2,3 delims=/” %%a in (file.txt) do echo a=%%a; b=%%b; c=%%c

Результат будет:

cmd написал(а):

вместо ожидаемого

cmd написал(а):

3) Все специальные (служебные) символы необходимо экранировать (предварять птичкой ^).
Это такие символы, как | = ^ < > &. А также % ! – если они используются не для раскрытия переменной, кроме случая с !, когда не включено удаленное расширение переменных.
Сюда же входит знак кавычки, которая соответствует форме кавычки, применяемой для определения вида набора.

4) Регистр переменной цикла имеет значение.

5) Изменить вручную значение переменной цикла нельзя. Например, set %%A=param не даст эффекта.

6) После выхода из цикла переменная цикла уничтожается.

7) Внутри цикла можно использовать не более 1-го комментария вида :: (иначе, будет критическая ошибка и “вылет” из пакетного файла)
Вместо этого используем Rem.

:/>  Как включить и настроить Wi-Fi на ноутбуке? Пошаговая инструкция для Windows 7 и 10

8) Внутри цикла можно использовать не более 1-й метки (иначе, будет такой же “вылет”).

Пример максимально допустимой конструкции:

@echo off
for %%n in ( 0 1 2 3 4 5 6 7 8 9 ) do (
:label
echo %%n
:: comment
echo %%n
)

9) Тем не менее из цикла можно безвозвратно выйти на метку Goto metka
а также выйти в подпрограмму и вернутся снова в цикл точно в ту же позицию через команду Call :metka
В конце подпрограммы должна стоять команда Exit /B

10) Для получения значения обычной переменной внутри цикла в случае, если этой переменной было присвоено новое значение внутри тела этого же цикла, необходимо раскрывать переменную через знаки восклицания !variant! – это называется отложенное расширение переменных.
Перед использованием такого способа, его нужно включить, задав в начале пакетного файла команду:

SetLocal EnableDelayedExpansion

Иначе, если использовать обычный способ раскрытия %variant%, мы получим значение переменной, присвоенное ей еще до входа в цикл.
Точно таким же образом (через ! ) необходимо раскрывать переменную времени внутри цикла, т.к. иначе для цикла время “замерзает”.
Происходит это потому, что в цикл попадает т.н. “слепок” переменных среды. И работа с ними через % происходит уже как с копией данных, а не актуальными значениями.

11) Когда после IN указана команда, под разбор цикла попадают такие потоки:
1-й поток (StdOut)
с 3-го по 9-й поток (User Stream)

При этом 2-й поток (StdError) отображается на экране сразу после выполнения указанной в цикле команды в IN (…)
2-й поток можно занулить, обычным способом, не забыв экран:

FOR /F %%A IN (‘dir %someparam% 2^>nul’) do rem

Также можно перенаправить 2-й поток, чтобы он обрабатывался вместе с первым, вместо его вывода на экран:

:/>  Настройка кодировки шрифтов в cmd/bat (иероглифы, кракозябры)

FOR /F %%A IN (‘dir %someparam% 2^>^&1’) do rem

Собственно, чтобы наоборот, обрабатывать 2-й поток вместо первого, можно воспользоваться следующей конструкцией:

FOR /F %%A IN (‘dir %someparam% 1^>nul 2^>^&3’) do rem

12) При запуске цикла из консоли (cmd.exe) переменные цикла нужно указывать без удвоения знака процента %a.
Это же правило касается вызова цикла через Shell-подобные команды на других языках программирования.

13) Переменную цикла нельзя раскрыть внутри строки модификаторов другого цикла:

for /f %%q in (quote) do for /f “usebackq tokens=1* delims=%%q” %%a in (“%~dp01.txt”) do echo %%a%%b

но есть способ обхода от ComSpec:

Sleep.exe из windows xp resource kit (или windows 2003 resource kit — смотря какая ос).

Из краткой справки

    sleep.exe/?
    Usage:  C:Program FilesWindows Resource KitsToolssleep.exe      time-to-sleep-in-seconds
            C:Program FilesWindows Resource KitsToolssleep.exe [-m] time-to-sleep-in-milliseconds
            C:Program FilesWindows Resource KitsToolssleep.exe [-c] commited-memory ratio (1%-100%)

понятно, что для задержки в 10 секунд надо запустить

    sleep.exe 10

а для задержки 500 мс надо написать

    sleep.exe -m 500

Преимущества: можно задавать задержки в секундах и миллисекундах.

Недостатки: SLEEP.EXE не входит в стандартный комплект Windows и может оказаться, что на другом компьютере его нет.

Инструкция

Цикл организуется следующим образом:

:loop
... <- здесь команда для создания паузы
... <- здесь другие команды, которые необходимо выполнять в цикле
goto loop

Паузу можно создать несколькими способами. В операционных системах Windows Vista, и более новых, для этого существует команда timeout:

timeout /t 5

где параметр /t – это время ожидания в секундах.

Как выполнить cmd файл в цикле с задержкой между каждой итерацией?

цикл for – это то, что вы хотите. в этом случае мы говорим, что начинаем подсчет на 1, шаг 1, заканчиваем на 5, что означает, что вы будете запускать 5 циклов. Более подробную информацию о for запуска из cmd.exe for/?

Время ожидания зависит от вашей версии ОС. Старая ОС не имеет этого, то, возможно, посмотрите на более старую версию, называемую sleep или, альтернативно, используйте команду ping с подсчетом таймаута, который вы хотите, 1. timeout В некоторых версиях Windows вам не нравится /t и поэтому можно использовать без него. т.е. timeout 5

@echo off
for %%i in (1,1,5) do (
echo We do something here..
timeout /t 5
)

Чтобы узнать о командах Windows cmd/batch и о том, как их использовать в пакетных файлах, вы можете открыть cmd и ввести help котором будет отображаться множество команд. каждый из них может быть запущен, за которым следует /? чтобы получить полную помощь по каждой команде.

:/>  — В процессе установки Windows 10 возникла проблема с созданием или поиском разделов, в результате чего появилось сообщение об ошибке «Нам не удалось создать новый или найти существующий раздел». Проблему можно решить с помощью полного руководства по исправлению для 2022 года. Установка Windows 10 вызвала затруднения, поскольку не удалось создать или обнаружить раздел, в результате чего появилось сообщение «Нам не удалось создать новый или найти существующий раздел». Эффективное решение этой проблемы доступно в полном руководстве по исправлению за 2022 год

Скрипт wsh/jscript

Создаём на JScript небольшой скрипт SLEEP.JS, использующий функцию WScript.Sleep:

    if(WScript.Arguments.Unnamed.length){
      var milliseconds=WScript.Arguments.Unnamed(0);
      WScript.Sleep(milliseconds);
    }

и вызываем его из командного файла, например, задержка 10 секунд:

    cscript //nologo sleep.js 10000

или 500 мс

    cscript //nologo sleep.js 500

Преимущества: можно задавать задержки в секундах и миллисекундах; не требуются сторонние программы.

Оставьте комментарий