Загрузка данных
@echo off
setlocal EnableDelayedExpansion
chcp 65001 >nul
title Ожидание заданного времени и циклический запуск
:: ============================================================
:: НАСТРОЙКИ
:: Формат даты: ГГГГ-ММ-ДД (например 2026-12-25)
:: Формат времени: ЧЧ:ММ (например 02:15)
:: ============================================================
set "START_DATE=2026-09-22"
set "START_TIME=03:12"
set "END_DATE=2026-09-22"
set "END_TIME=03:15"
:: ============================================================
call :PARSE_TARGET "%START_DATE%" "%START_TIME%" START
call :PARSE_TARGET "%END_DATE%" "%END_TIME%" END
echo [%date% %time%] Скрипт запущен.
echo Ожидание наступления %START_DATE% %START_TIME%
echo Окончание работы: %END_DATE% %END_TIME%
echo.
:WAIT_LOOP
call :GET_NOW
if "!NOW_Y!"=="" goto :WAIT_LOOP
:: Если время окончания уже прошло — выходим сразу
call :CMP_GE !END_Y! !END_M! !END_D! !END_H! !END_N!
if "!RESULT!"=="1" (
echo [%date% %time%] Время окончания уже наступило.
goto FINISH
)
:: Если время старта уже наступило — стартуем
call :CMP_GE !START_Y! !START_M! !START_D! !START_H! !START_N!
if "!RESULT!"=="1" goto START_WORK
timeout /t 20 /nobreak >nul
goto WAIT_LOOP
:START_WORK
echo.
echo [%date% %time%] Наступило время старта. Запускаю основной цикл...
:MAIN_LOOP
:: ============================================================
:: ЗДЕСЬ ВАШ КОД, КОТОРЫЙ ВЫПОЛНЯЕТСЯ В ЦИКЛЕ
:: ============================================================
echo [%date% %time%] Итерация цикла...
:: Пример полезной нагрузки:
:: call C:\путь\к\скрипту.bat
:: python C:\путь\к\скрипту.py
timeout /t 160
:: ============================================================
call :GET_NOW
call :CMP_GE !END_Y! !END_M! !END_D! !END_H! !END_N!
if "!RESULT!"=="1" goto FINISH
timeout /t 60 /nobreak >nul
goto MAIN_LOOP
:FINISH
echo.
echo [%date% %time%] Достигнуто время окончания. Останавливаюсь.
pause
exit /b 0
:: ============================================================
:: ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ
:: ============================================================
:: --- Получить текущее время в NOW_Y, NOW_M, NOW_D, NOW_H, NOW_N ---
:GET_NOW
set "NOW_Y=" & set "NOW_M=" & set "NOW_D=" & set "NOW_H=" & set "NOW_N="
set "DT="
for /f "delims=" %%a in ('powershell -NoProfile -Command "Get-Date -Format yyyyMMddHHmm" 2^>nul') do set "DT=%%a"
if "!DT!"=="" (
echo Не удалось получить текущее время, повтор через 5 сек...
timeout /t 5 /nobreak >nul
goto :GET_NOW
)
set "NOW_Y=!DT:~0,4!"
set "NOW_M=!DT:~4,2!"
set "NOW_D=!DT:~6,2!"
set "NOW_H=!DT:~8,2!"
set "NOW_N=!DT:~10,2!"
call :STRIP_ZERO NOW_M
call :STRIP_ZERO NOW_D
call :STRIP_ZERO NOW_H
call :STRIP_ZERO NOW_N
exit /b 0
:: --- Разобрать целевую дату/время ---
:: %1 = "YYYY-MM-DD", %2 = "HH:MM", %3 = префикс результата
:PARSE_TARGET
set "Y=" & set "M=" & set "D=" & set "H=" & set "N="
for /f "tokens=1,2,3 delims=-/. " %%a in ("%~1") do (
set "Y=%%a" & set "M=%%b" & set "D=%%c"
)
for /f "tokens=1,2 delims=: " %%a in ("%~2") do (
set "H=%%a" & set "N=%%b"
)
call :STRIP_ZERO M
call :STRIP_ZERO D
call :STRIP_ZERO H
call :STRIP_ZERO N
set "%~3_Y=!Y!" & set "%~3_M=!M!" & set "%~3_D=!D!" & set "%~3_H=!H!" & set "%~3_N=!N!"
exit /b 0
:: --- Убрать ведущий ноль: "06" -> "6", "00" -> "0" ---
:STRIP_ZERO
set "V=!%~1!"
if "!V:~0,1!"=="0" if not "!V!"=="0" set "V=!V:~1!"
if "!V:~0,1!"=="0" if not "!V!"=="0" set "V=!V:~1!"
set "%~1=!V!"
exit /b 0
:: --- Проверить, что NOW >= (Y,M,D,H,N). RESULT=1 если да, иначе 0 ---
:CMP_GE
set "RESULT=0"
if !NOW_Y! GTR %1 ( set "RESULT=1" & exit /b 0 )
if !NOW_Y! LSS %1 exit /b 0
if !NOW_M! GTR %2 ( set "RESULT=1" & exit /b 0 )
if !NOW_M! LSS %2 exit /b 0
if !NOW_D! GTR %3 ( set "RESULT=1" & exit /b 0 )
if !NOW_D! LSS %3 exit /b 0
if !NOW_H! GTR %4 ( set "RESULT=1" & exit /b 0 )
if !NOW_H! LSS %4 exit /b 0
if !NOW_N! GTR %5 ( set "RESULT=1" & exit /b 0 )
if !NOW_N! LSS %5 exit /b 0
set "RESULT=1"
exit /b 0