Another option - and one I use quite a bit - is to create an app that just runs as long as the computer is on. Start the app via the Startup folder.
The entire app is inside a while loop that never ends. (e.g. while 1 .... endwhile), and you can call various goSubs in succession. Each :Subroutine can check the time, and if the time is after your trigger time, run the procedure and then create a var such as _ranBackup = timeYmdHms() -- the beginning of the subroutine checks if isDefined(_ranBackup) and, if so, just Returns.
The final goSub in the while loop checks if it is midnight, and if so, drops the vars so all is ready for the next day. Nice thing about using timeYmdHms() as the content of a var:
if timeDiffSecs(timeYmdHms(), _ranMidnightReset) > (60*60*2) then drop(_ranMidnightReset), and you are ready for the next EoD.