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
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).