IF exist for scheduled task

Tom picture Tom · Jan 10, 2017 · Viewed 13.3k times · Source

I have created a batch file to check if scheduled task exists and if they don't create them, however, my if exist rule seem to always hit true even though the jobs are not there.

Any ideas?

::Check Rule
IF EXIST SchTasks /QUERY /TN "Cache Task Morning"  ( 
    echo ! Morning rule in place!
    GOTO NEXT 
) ELSE IF NOT EXIST SchTasks /Create /SC DAILY /TN "Cache Task Morning" /TR "C:\Cache Clear\Cache Clear.bat" /ST 09:00 

:NEXT
IF EXIST SchTasks /QUERY /TN "Cache Task Afternoon"  ( 
    echo ! Afternoon rule in place!
    GOTO NEXT TWO
) ELSE IF NOT EXIST SchTasks /Create /SC DAILY /TN "Cache Task Afternoon" /TR "C:\Cache Clear\Cache Clear.bat" /ST 15:00 

:NEXT TWO
IF EXIST SchTasks  /QUERY /TN "Cache Task Evening"  ( 
    echo ! Evening rule in place!
    GOTO CLEAR CACHE 
) ELSE IF NOT EXIST SchTasks /Create /SC DAILY /TN "Cache Task Evening" /TR "C:\Cache Clear\Cache Clear.bat" /ST 18:00 

Answer

elzooilogico picture elzooilogico · Jan 10, 2017

You cannot use if exist with schtasks, this is not the purpose of if exist.

use either

schtasks /query /TN "task_name" >NUL 2>&1 || schTasks /Create /SC DAILY /TN "task_name" ...

or

schtasks /query /TN "task_name" >NUL 2>&1
if %errorlevel% NEQ 0 schTasks /Create /SC DAILY /TN "task_name" ...

>NUL 2>&1 suppress success or error output, but we have errorlevel set to 0 if success, or not 0 if failure.

Both are pretty the same. In the first case we use the cmd && and || operators, where && means previous command succesful and || means previous command failed.

as in

mycommand && echo success || echo error

As we only want to test failure, then use only || (previous command failed).