@REM - TimedStart.BAT (06 Jun 2024 // 23 Jun 2024): Check for Earliest Start Date @ECHO OFF rem -- Initialize Environment Variables :Variables SETLOCAL ENABLEDELAYEDEXPANSION rem -- Main Variables SET #INTERVAL=28 SET #R_KEY=HKCU\Software\CustomLocation\%~n0 SET #R_VAL=NextRunTime SET #R_TYPE=REG_SZ SET #METHOD=REGISTRY SET #ROOTDIR=%SystemDrive%\Temp SET #FLAG=%#ROOTDIR%\NextDate.TXT rem -- Get Date Info (using DateInfo.exe) rem -- https://www.majorgeeks.com/files/details/dateinfo.html rem -- Yes, you can do the date manipulation 100% natively, but I hated date calculations enough to write a utility to not have to deal with them any more. LOL. So I don't. FOR /F "TOKENS=1" %%N IN ('DATEINFO -s -a %#INTERVAL% -f "yyyy-mm-dd" -q') DO SET "#NEXTRUN=%%N" FOR /F "TOKENS=1-4" %%D IN ('DATEINFO -s -f "yyyy-mm-dd yyyy mm dd" -q') DO ( SET #TODAY=%%D SET #YYYY=%%E SET #MM=%%F SET #DD=%%G ) rem -- Check for Valid Date Entry :CheckDateEntry FOR /F "TOKENS=3" %%R IN ('REG QUERY "%#R_KEY%" /V "%#R_VAL%" 2^>NUL') DO SET #COMPARE=%%~R rem -- Check for Registry Key, and if not exist, fall-back to File-based Flag IF NOT DEFINED #COMPARE ( SET #METHOD=FILE-BASED FLAG IF NOT EXIST "%#ROOTDIR%" MD "%#ROOTDIR%" >NUL 2>NUL IF NOT EXIST "%#FLAG%" GOTO :DoWork rem -- Read Date from Flag File rem -- Valid File Format = "Next-Run-Date: yyyy-mm-dd" FOR /F "TOKENS=2 USEBACKQ DELIMS=|" %%D IN ("%#FLAG%") DO SET #COMPARE=%%D ) rem -- This next command is just there to force testing without having to change date/time on the computer. rem -- Run it as TimedStart 2024-01-01 and it will pretend that the date it read from the file is 2024-01-01 and run accordingly rem -- You will want to remove it in production IF NOT "%~1"=="" SET #COMPARE=%~1 rem -- If File is Empty or Not Formatted Properly, Go Do Regular Work IF NOT DEFINED #COMPARE GOTO :DoWork rem -- Once you have the new date, compare it (#COMPARE) against the current date in the same format (#TODAY) IF "%#TODAY%" LSS "%#COMPARE%" ( ECHO Not valid for execution before "%#COMPARE%" via %#METHOD% GOTO :ExitBatch ) rem -- Do Main Work :DoWork ECHO DO WORK HERE... ECHO DO WORK HERE... ECHO DO WORK HERE... ECHO DO WORK HERE... ECHO DO WORK HERE... ECHO DO WORK HERE... ECHO: rem -- Save Next Earliest Date for Execution (Try Registry, then fall-back to File-based Flag as Needed) :SaveNextDate REG ADD "%#R_KEY%" /V %#R_VAL% /T %#R_TYPE% /D %#NEXTRUN% /F rem -- If you don't care about a fall-back to file-based Flag, then the next two commands are unnecessary FOR /F "TOKENS=3" %%R IN ('REG QUERY "%#R_KEY%" /V "%#R_VAL%" 2^>NUL') DO SET #REG_QUERY=%%~R IF NOT DEFINED #REG_QUERY ECHO Next-Run-Date^|%#NEXTRUN%>"%#FLAG%" rem -- You don't have to make the date as the second parameter in the FLAG file, but it helps to ensure that it was your script that wrote the file. rem -- The next three lines are just debug lines to verify the output for testing ECHO NEXT EARLIEST RUN DATE ... %#NEXTRUN% ECHO REGISTRY VALUE ........... %#REG_QUERY% DIR "%#FLAG%" | FIND /I "%#FLAG:~-4%" TYPE "%#FLAG%" rem -- Reset Environment Variables and Exit Batch File :ExitBatch ENDLOCAL GOTO :EOF