Subj : Revised DAYBOOT1.BTM To : All From : Gerald Miller Date : Tue Sep 23 2003 11:05 am Hello All, In the interest of seeing some traffic in this echo area.... === Cut Begin: DAYBOOT1.BTM === :: DAYBOOT1.BTM VERSION 1.36 Sep-16-2003 :: 01:36:00 :: (Once a day program upon boot execution) :: :: by Gerald Miller :: Fidonet 1:342/512 :: and Jasen Betts :: Fidonet 3:640/1042 :: :: based on the original XBOOTEX.BTM by Klaus Meinhard :: Brahmsstr. 12 :: G 26842 Ostrhauderfehn :: Germany :: Compuserve 100115,2025 :: :: For those of you who have more extensive needs than can be filled by :: XDAILY.BTM (DAILY.BTM), here is a utility that allows you a very :: versatile handling of programs you want to run only once a day at :: first boot time. :: :: DAYBOOT1 allows you to specify as many programs as you wish in the :: data file DAYBOOT1.DAT, with an interval in days for running each :: program and the possibility to ask if the program should be run :: (nice if you do not have the time for it just then). You will be :: asked again the next day if you skip. :: :: If you want to run another batch file, enter `c:\path\mybatch` :: in DAYBOOT1.DAT to insure the return to DAYBOOT1.BTM after execution. :: If your program (batch file) is on the path, you may omit the :: pathname. :: :: So, maybe you want to run STACKER's CHECK every day, but a virus :: scanner only once a week, and defrag once a month? No problem, :: just fill in those programs in DAYBOOT1.DAT with the appropriate :: parameters. Just be careful not to change the formatting of that :: file, because DAYBOOT1.BTM depends on it. :: :: There is an example data file (DAYBOOT1.DAT) which shows the working of :: all this and makes calls to five BTM files [one, of which, is included :: as a working example] to show you how DAYBOOT1 works. :: :: Some of the NEXT RUN date field and DAYS LEFT field within the :: DAYBOOT1.DAT file are "zeroed" out on the theory that the first time :: you execute the DAYBOOT1.BTM, all the fields should contain the :: "correct" data upon completion. :: :: The five "simple" BTM files all echo their name to the screen and :: "touch themselves" when called upon based on the information contained :: in the data file. (The date and time stamp of the five BTM files will :: change based on execution.) :: :: Call DAYBOOT1.BTM from your autoexec.bat. DAYBOOT1.DAT _must_ be in :: your path or the root dir of your boot drive! :: :: This .BTM was created and tested using 4DOS version 6.02B (131). THERE :: IS NO 4DOS VERSION CHECKING BEING PERFORMED BY THIS .BTM!!! :: :: ** Features fixed / added / pending: :: :: - Removed all leading "_" characters from non-4DOS variable names to :: avoid possible conflict of future 4DOS variable names. :: - Calculate the date of a program's next call. :: - Calculate the number of days remaining until the next call. :: - Removed the necessity to have `CALL` within the data file (the :: batch file now makes the CALLs to all programs/batch files) :: - Implemented a date conversion routine to change the date format of :: the data file to match that of the current user's system (ISO :: format). This action is done "on_the_fly" and need only be :: performed once, but the beauty of this routine means that data :: files can be exchanged between systems and operate correctly on :: the first attempt. :: - Calculate Leap Year data for occasions when a batch file or :: program is called only once a year. :: - Added a different rule that compensates for missed days (gosub :: schedule_prog); that rule is used when %when starts with a "+" so :: if you want something done on Mondays, set %last to a Monday and :: put +7 in the rule and it'll do it on Mondays and if you forget to :: boot one Monday it'll do it on Tuesday instead like always but and :: it will do it next on Monday again... it's also handy for :: birthdays... :: - Corrected a "negative number" problem in the schedule_prog :: subroutine that was displaying incorrect data for DAYS LEFT in the :: data file. :: :: I recommend that all the CALLed batch files end with: :: :: touch/q %_batchname :: :: to serve as an indicator of when that batch file was last run. I :: ****DO NOT**** recommend that you use the touch command on :: ****ANY**** executable (i.e.: *.COM, *.EXE, *.CMD, etc.) file!!! :: :: Further suggestions welcome :START *setlocal %+ *unalias * break on on break goto END if "%temp" eq "" set temp=C:\ :: Next command establishes the location of the variable "BOOTFILE" :: (DAYBOOT1.DAT) [should be in the same directory as this BTM file...] set bootfile=%@path[%@search[%0]]%@upper[%@name[%0]].DAT :: Next command establishes the location and name of the variable :: "TEMPFILE" that holds the temporary file information while the :: action is performed. set tempfile=%@unique[%temp] :: User input if [%1]==[-?] .or. [%1]==[/?] .or. [%1]==[?] .or. %= [%1]==[-h] .or. [%1]==[/h] .or. [%1]==[h] .or. %= [%1]==[-H] .or. [%1]==[/H] .or. [%1]==[H] goto USAGE :: Is the file DAYBOOT1.DAT there? Where? iff not exist %bootfile then echo. color bri red on bri whi echos ERROR: %@path[%@search[%0]]%@upper[%@name[%0]].DAT was not found! color bri cya on bla echo. %+ delay 10 goto END endiff :: Set variables. If DAYBOOT1 did it's job today already or it's before :: 00:01 am, do nothing. In this case, the "start" time is 00:01 am.... :: Change the %do_time variable to suit your requirements. set lastdate=%@date[%@filedate[%bootfile]] set today=%@date[%_date] set do_time=00:01 set country=%_country iff %@eval[%lastdate - %today] eq 0 .or. %@eval[%@time[%_time] - %= %@time[%do_time]] le 0 then echo. %+ echo. color bri red on bri whi echos There is nothing to do today because it's all been done! color bri cya on bla echo. goto END endiff :: Read DAYBOOT1.DAT, look at which programs to run today, copy info to :: UNIQUE.TMP and update DAYBOOT1.DAT set i=0 echo. :: df is local date format. set df=%@replace[2,D,%@replace[20,YY,%@replace[1,M,%@makedate[14936]]]] :: *** IMPORTANT NOTE *** :: if you are "cutting" this btm from the Fidonet 4DOS echo, be aware that :: there will be a blank line between "text>%tempfile" and "PATH\PROG..." :: which you will be required to remove! text>%tempfile PATH\PROGRAM TO RUN ³AFTER³ ³ ³DAYS ³ ³ DAYS³LAST RUN³NEXT RUN³ LEFT³ASK endtext echo ÄÄÄÄ %@format[03.3,%country] %@repeat[Ä,12] Time: %_time ÄÄÄÄÅ%= ÄÄÄÄÄÅ%df%Å%df%ÅÄÄÄÄÄÅÄÄÄ >> %tempfile set orig=%@instr[48,8,%@line[%bootfile,2]] iff %orig == %df then set dateconversion=%%date else :: Build a date conversion expression in a variable... set dateconversion=%= %%@instr[%@index[%orig,%@instr[0,2,%df]],2,%%date]%@instr[2,1,%df]%= %%@instr[%@index[%orig,%@instr[3,2,%df]],2,%%date]%@instr[5,1,%df]%= %%@instr[%@index[%orig,%@instr[6,2,%df]],2,%%date] echo. echo Converting date format from %orig to %df using expression: echo. set dateconversion endiff unset orig df do n=3 to %@lines[%bootfile] set prog=%@instr[0,41,%@line[%bootfile,%n]] set when=%@instr[42,5,%@line[%bootfile,%n]] :: Convert last to local format set date=%@instr[48,8,%@line[%bootfile,%n]] set last=%dateconversion set left=%@instr[66,5,%@line[%bootfile,%n]] set ask=%@instr[72,1,%@line[%bootfile,%n]] if "%prog" == "" iterate iff %@eval[%today-%@date[%last]] ge %when then iff "%ask" eq "Y" then beep 294 2 330 2 277 2 294 2 330 2 277 2 294 2 330 2 277 2 294 2 beep 330 2 0 2 139 2 165 2 196 2 233 2 277 2 466 2 554 2 659 2 beep 784 2 932 2 scrput %_row %@eval[17+%@len[%prog]] bri yel on bla `Y` inkey /c/K"YN[esc][enter]" `Execute `%@upper[%prog]` [Y/N] ?` %%ink echo. %+ echo. iff "%ink" eq "Y" .or. "%ink" eq "@28" then gosub schedule_prog endiff elseiff "%ask" eq "N" .or. "%ask" eq "" then gosub schedule_prog endiff endiff if "%when" == "" set when=. iff %when eq 365 .or. %when eq 366 then :: LeapYear correction: try 366 days; if no good, use 365 set when=+366 set nxdate=%@makedate[%@eval[%@date[%last]+%when]] if %@day[%nxdate] ne %@day[%last] set when=+365 endiff set nextdate=%@eval[%@date[%last] + %when] set daysleft=%@eval[%nextdate - %today] set nxdate=%@makedate[%nextdate] echo %@format[-41.41,%prog]³%@format[-5.5,%when]³%@format[-8.8,%last]%= ³%@format[-8.8,%nxdate]³%@format[-5.5,%daysleft]³%ask>>%tempfile unset/q prog daysleft nextdate nxdate when enddo unset/q next, move/q/u %tempfile %bootfile >& nul iff "%i" ne "0" then do m=1 to %i echo. %+ echo. color bri whi on whi echos %@upper[%0] Program Execution: color bri cya on bla echo %@upper[%[run%m]] echo. call %[run%m] @echo off enddo endiff echo. color bri red on bri whi echos %@upper[%0] END color bri cya on bla echo. :END color bri cya on bla delay 5 if exist %tempfile del/q %tempfile > nul endlocal color bri cya on bla quit :schedule_prog set i=%@inc[%i] set run%i=%prog iff "%@left[1,%when]" ne "+" then set last=%@makedate[%today] else set last=%@makedate[%@eval[%@date[%last] + %= (%today - %@date[%last]) \ %when * %when]] endiff return :USAGE color bri cya on bla text ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ DAYBOOT1 ÄÄÄÄÄÄÄ VERSION 1.36 Sep-16-2003 01:36:00 ³ ³ by Gerald Miller (Fidonet 1:342/512) ³ ³ and Jasen Betts (Fidonet 3:640/1042) ³ ³ ³ ³ Once a day program execution with many options ³ ³ (selectable intervals, ask before execution). ³ ³ For more info see the header of this file. ³ ³ ³ ³ DAYBOOT1.DAT is the data file for DAYBOOT1.BTM, ³ ³ where you can enter your progs and parameters. ³ ³ It _must_ be in your path or the root dir of ³ ³ your boot drive. (See the sample: ³ ³ "Cut Begin: DAYBOOT1.DAT" ³ ³ near the end of this BTM file.) ³ ³ ³ ³ DAYBOOT1 should be _called_ from autoexec.bat ³ ³ ³ ³ Syntax: DAYBOOT1 /? -? Syntax (this screen) ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ endtext goto END :: === EOF - DAYBOOT1.BTM === === Cut End: DAYBOOT1.BTM === === Cut Begin: DAYBOOT1.DAT === PATH\PROGRAM TO RUN ³AFTER³ ³ ³DAYS ³ ³ DAYS³LAST RUN³NEXT RUN³ LEFT³ASK ÄÄÄÄ 001 ÄÄÄÄÄÄÄÄÄÄÄÄ Time: 00:01:58 ÄÄÄÄÅÄÄÄÄÄÅMM-DD-YYÅMM-DD-YYÅÄÄÄÄÄÅÄÄÄ STEP_0.BTM ³1 ³08-31-03³00-00-00³000 ³N STEP_1.BTM ³1 ³08-31-03³00-00-00³000 ³N STEP_2.BTM ³+7 ³08-31-03³00-00-00³000 ³Y STEP_3.BTM ³+14 ³08-31-03³00-00-00³000 ³N STEP_4.BTM ³+14 ³08-24-03³00-00-00³000 ³ birthday.btm /Addison ³+365 ³02-23-03³00-00-00³000 ³N birthday.btm /Michael ³+365 ³03-06-03³00-00-00³000 ³N birthday.btm /Arlene ³+365 ³08-16-03³00-00-00³000 ³N birthday.btm /Gerard ³+365 ³11-22-02³00-00-00³000 ³N birthday.btm /Eileen ³+365 ³12-27-02³00-00-00³000 ³N === Cut End: DAYBOOT1.DAT === The above sample .DAT file _should_ be able to be run on your system with no evil consequences. When you have verified that the sample data file can run with no ill effects, you should revise the data file to run the programs that you require and I suggest that you prefix the program with the full pathname, even if the program is already on the path... === Cut Begin: Example.DAT === PATH\PROGRAM TO RUN ³AFTER³ ³ ³DAYS ³ ³ DAYS³LAST RUN³NEXT RUN³ LEFT³ASK ÄÄÄÄ 001 ÄÄÄÄÄÄÄÄÄÄÄÄ Time: 00:01:58 ÄÄÄÄÅÄÄÄÄÄÅMM-DD-YYÅMM-DD-YYÅÄÄÄÄÄÅÄÄÄ C:\Nu\IMAGE C: D: E: F: /noback /out ³1 ³09-17-03³00-00-00³000 ³N C:\Pct\MIRROR C: D: E: F: /1 ³1 ³09-17-03³00-00-00³000 ³N C:\4d\4b\D&S_COL.BTM ³1 ³09-17-03³00-00-00³000 ³N C:\4d\4x\XCORTIME.BTM /s ³1 ³09-17-03³00-00-00³000 ³N C:\Nu\auto_SPD.BTM ³+7 ³09-15-03³00-00-00³000 ³N D:\Tbav\FP.BAT ³+14 ³09-15-03³00-00-00³000 ³N E:\Scan\SCN.BTM ³+14 ³09-08-03³00-00-00³000 ³N === Cut End: Example.DAT === If your country code is different than "001", it will be replaced with your current country code. The time field will change to the time that you execute this .BTM. The date fields will change in accordance to your country code. For example, if your country code is set for Australia, "001" will change to "061" and the current date fields in the above example, "MM-DD-YY" will automatically change to "DD/MM/YY". All the remaining dates in the above sample .DAT file will be converted "on-the-fly" to the correct format as reflected by your country code. The Days Left field will be adjusted to the correct value *AFTER* you execute this .BTM. You may change the value in the Ask field; an empty expression (blank character) in this field is presumed to be a "N". I'll include a sample TEST batch file (STEP_0.BTM) and you can copy it to the other four test files and rename each as appropriate... === Cut Begin: STEP_0.BTM === echo. %+ echo This is %@upper[%@name[%_batchname]]. %+ echo. touch/q %_batchname === Cut End: STEP_0.BTM === === Cut Begin: BIRTHDAY.BTM === beep 262 3 262 1 294 6 262 6 349 6 330 15 beep 262 3 262 1 294 6 262 6 392 6 349 15 beep 262 3 262 1 523 6 440 6 349 6 330 6 294 15 beep 466 3 466 1 440 6 349 6 392 6 349 15 touch/q %_batchname === Cut End: BIRTHDAY.BTM === If you want to run a compressed / compiled BTM _after_ you have verified the operation of the btm and your data file, remove all the text after the line: ":: === EOF - DAYBOOT1.BTM ===", save the results as DAYBOOT1.IN, then run the BATCOMP.EXE command with the following: BATCOMP DAYBOOT1.IN DAYBOOT1.BTM which will remove all the inline comments (:: REM) and will result in a much smaller binary file; **BUT** I recommend that you retain your DAYBOOT1.IN text file in a secure place in the event that you need to make revisions, or the compiled btm file does not perform in the manner that it should. As usual, I'm not responsible for any damages.... :-) Cheers ... Gerald .... To establish voice contact, please yell into keyboard. --- GoldED+/DPMI32 v1.1.5-30512 * Origin: You're not lost if you don't care where you are! (1:342/512) .