[Back to EXEC SWAG index] [Back to Main SWAG index] [Original]

      {NEWCMD.PAS}
    {$M $4000,0,0 }   { 16K stack, no heap }

    PROGRAM RunDos( input, output, ProgramFileInstance );

    USES Dos,CRT;

    TYPE
        ProgramRecordType = RECORD
                                  ProgramName   : string;
                                  CmdLine       : string;
                                  BootCount     : integer;
                                  ExecuteTarget : integer;
                            END; { of record ProgramRecordType }

        ProgramFile = FILE OF ProgramRecordType;

    VAR
       MyProgramRecord : ProgramRecordType;
       ProgramFileInstance : ProgramFile;
       I,LastParam : word;

    { ******************************************************************* }

    Function EmptyFile ( VAR MyFile : ProgramFile ) : Boolean;
        VAR
           MyFileSize : integer;

        BEGIN
           MyFileSize := FileSize( MyFile );

           if MyFileSize = 0 then
              BEGIN
                   EmptyFile := true;
              END;

        END; { End of function EmptyFile }

    { ******************************************************************* }

    PROCEDURE FirstTimeInit( VAR ProgramRecord : ProgramRecordType );

        BEGIN
             writeln('NEWCOMMAND Version 95.1');
             writeln;
             writeln('This program is Public Domain software');
             writeln;
             writeln('Enter program to execute? ');
             writeln('Use the full path including extension');
             writeln('Example:  c:\dos\myfile.exe');
             readLn(ProgramRecord.ProgramName);

             writeln('Command line options to pass to ', ProgramRecord.ProgramName );
             writeln('Example: c: /U  ');
             readLn(ProgramRecord.CmdLine);

             write('Execute program after how many computer startups?: ');
             readln( ProgramRecord.ExecuteTarget );

             ProgramRecord.BootCount := 0;

        END; { of procedure FirstTimeInit }

    { *******************************************************************  }

    Procedure ExecuteProgram( VAR MyFile : ProgramFile; VAR ProgramRecord : ProgramRecordType );

    VAR
       I : integer;
       J : integer;
        BEGIN
             writeLn('About to Execute: ', ProgramRecord.ProgramName ,
                       ProgramRecord.CmdLine );
             writeln;
             write('Press any key to halt...');
             for I := 1 to 10 do
                 begin
                   delay( 1000  );
                   write('.');
                   if KeyPressed then
                      begin
                           close( MyFile );
                           halt(0);
                      end;
                 end;

             writeln;
             writeln;

             SwapVectors;
             Exec( ProgramRecord.ProgramName, ProgramRecord.CmdLine );
             SwapVectors;

             writeLn('...back from Executing ');

                 if DosError <> 0 then{ Error? }
                    writeLn('Dos error #', DosError)
                 else
                     writeLn('Exec successful. ','Child process exit code = ',
                          DosExitCode);
         END; { of procedure ExecuteProgram }

    { ******************************************************************** }

    PROCEDURE PrintDialog;
        BEGIN
             writeln('NEWCOMMAND Version 95.1');
             writeln('written by Andy onlin@aol.com');
             writeln('This program is public domain software');
             writeln;
             writeln('NEWCOMMAND Version 95.1 is a DOS batch scheduling program.');
             writeln('Its purpose is to launch the execution of other programs from your autoexec.bat');
             writeln('file. SYNTAX: newcmd2 [ drive:path filename1...drive:path filenameN ]');
             writeln('A computer running DOS 3.3 or later is all that you need to use NEWCOMMAND.');
             writeln('To use this program:');
             writeln(' 1.   copy newcmd2.exe to your hard drive');
             writeln(' 2.   type its full path in the last line of autoexec.bat');
             writeln('      with descriptive file(s) argument(s)');
             writeln('          example: c:\dos\newcmd.exe c:\mydefrag.rec c:\myscan.rec');
             writeln(' 3.   the first time newcmd.exe runs it will prompt for');
             writeln('      the program you wish to schedule, then any command line options');
             writeln('      that you can use with the newly schedule program.  Last you need');
             writeln('      to enter how many times you will start the computer');
             writeln('      before newcmd2.exe launches the program you specified above.');
             writeln;
             writeln('The specified program will launch at the specified interval until you remove');
             writeln('the record file from the command line.');

        END; { of procedure PrintDialog }

    { ******************************************************************* }

    BEGIN
         LastParam := ParamCount;

         if LastParam = 0 then
            PrintDialog
         else
             BEGIN
                  for I := 1 to LastParam do
                      BEGIN
                           assign( ProgramFileInstance, ParamStr(I));
                           {$I-}
                           Reset(ProgramFileInstance);
                           {$I+}
                           if IOResult <> 0 then
                               rewrite( ProgramFileInstance );

                           if  EmptyFile( ProgramFileInstance ) = true  then
                               BEGIN
                                    FirstTimeInit( MyProgramRecord );
                                    write ( ProgramFileInstance, MyProgramRecord );
                               END;

                           seek( ProgramFileInstance, 0 );

                           read( ProgramFileInstance, MyProgramRecord );

                           if MyProgramRecord.BootCount >= MyProgramRecord.ExecuteTarget then
                              BEGIN
                                   ExecuteProgram( ProgramFileInstance, MyProgramRecord );
                                   MyProgramRecord.BootCount := 1;
                              END
                           ELSE
                               MyProgramRecord.BootCount := MyProgramRecord.BootCount + 1;

                           seek( ProgramFileInstance, 0 );
                           write( ProgramFileInstance, MyProgramRecord );
                           close ( ProgramFileInstance );
                      END;
             END;
    END.

[Back to EXEC SWAG index] [Back to Main SWAG index] [Original]