I'm facing a problem where %errorlevel% return value of 0 even when archive of jar files failed.
What I'm trying to achieve is to archive log files in production environment. I use ROBOCOPY command to copy log files to a separated folder and try to archive those log files. "verify > nul" was used to reset the %errorlevel% back to 0 because the robocopy will set the value to 1 after execution.
However, when the error happened during the execution of jar command (i.e. no file to archive), %errorlevel% remain as 0 and program continue.
@ECHO off
SETLOCAL
ECHO [info] LogFileArchivaer Started at time %date% %time% ...
SET LOG_FILE_AGE_IN_DAY=7
REM Directory variable setting
FOR /F "tokens=1,2 delims==" %%G IN (config.properties) DO (
IF "%%G"=="log.app.dir.ori" (
IF NOT EXIST %%H\NUL (
ECHO [error] Directory "%%H" not exist!
GOTO ERROR
)
SET APP_LOG_DIR_ORI=%%H
)
IF "%%G"=="log.server.dir.ori" (
IF NOT EXIST %%H\NUL (
ECHO [error] Directory "%%H" not exist!
GOTO ERROR
)
SET SERVER_LOG_DIR_ORI=%%H
)
IF "%%G"=="log.batch.dir.ori" (
IF NOT EXIST %%H\NUL (
ECHO [error] Directory "%%H" not exist!
GOTO ERROR
)
SET BATCH_LOG_DIR_ORI=%%H
)
IF "%%G"=="log.app.dir.dest" (
IF NOT EXIST %%H\NUL (
ECHO [error] Directory "%%H" not exist!
GOTO ERROR
)
SET APP_LOG_DIR_DEST=%%H
)
IF "%%G"=="log.server.dir.dest" (
IF NOT EXIST %%H\NUL (
ECHO [error] Directory "%%H" not exist!
GOTO ERROR
)
SET SERVER_LOG_DIR_DEST=%%H
)
IF "%%G"=="log.batch.dir.dest" (
IF NOT EXIST %%H\NUL (
ECHO [error] Directory "%%H" not exist!
GOTO ERROR
)
SET BATCH_LOG_DIR_DEST=%%H
)
IF "%%G"=="log.file.age" (
SET /a LOG_FILE_AGE_IN_DAY="%%H"*1
)
)
REM Prepare formatted system date
SET year=%date:~-4%
SET month=%date:~3,2%
IF "%month:~0,1%" == " " SET month=0%month:~1,1%
SET day=%date:~0,2%
IF "%day:~0,1%" == " " SET day=0%day:~1,1%
SET hour=%time:~0,2%
IF "%hour:~0,1%" == " " SET hour=0%hour:~1,1%
SET min=%time:~3,2%
IF "%min:~0,1%" == " " SET min=0%min:~1,1%
SET datetime_formatted=%year%%month%%day%_%hour%%min%
ECHO [info] Age of log files to be archived: [%LOG_FILE_AGE_IN_DAY%] days.
ECHO [info] === Processing batch job log files ===
ROBOCOPY %BATCH_LOG_DIR_ORI% %BATCH_LOG_DIR_DEST% *.log /MINAGE:%LOG_FILE_AGE_IN_DAY%
IF %errorlevel% GEQ 2 GOTO ERROR
REM Reset the errorLevel value back to 0
verify > nul
IF exist %BATCH_LOG_DIR_DEST%*.log (
CD %BATCH_LOG_DIR_DEST%
jar -cvMf %BATCH_LOG_DIR_DEST%batch_job_log_%datetime_formatted%.zip *.log
IF %errorlevel% NEQ 0 GOTO ERROR
FOR /F %%J IN ('dir /b /A-D %BATCH_LOG_DIR_DEST%*.log') DO (
ECHO [info] Deleting file: %%J
DEL %BATCH_LOG_DIR_DEST%%%J
DEL %BATCH_LOG_DIR_ORI%%%J
IF %errorlevel% NEQ 0 GOTO ERROR
)
) ELSE (
ECHO [info] No batch log file to process.
)
ECHO [info] === Batch job log files archived completed ===
GOTO COMPLETED
:ERROR
ECHO [error] Error Occurred, program exit at time %date% %time%!
GOTO END
:COMPLETED
ECHO [info] LogFileArchivaer Completed at time %date% %time% ...
GOTO END
:END
Note: Varible are read from properties file. 3rd party library were not allowed to install, therefore I choose to use the jar command
Any hint how to detect if error occurred?
Thanks.
Use Delayed Expansion
Make sure to do this for all variables within parentheses scopes that are modified within the scope.
Whenever expanding variables inside a parenthetical scope
()
, the variables will be expanded to their values as they were before the scope began, unless expanded with Delayed Expansion or a workaround.Illustration
As an alternative to David method (use delayed expansion) which I support +1, you might use the
if errorlevel
command instead. I'd do.Read this Raymond Chen entry ERRORLEVEL is not %ERRORLEVEL% http://blogs.msdn.com/b/oldnewthing/archive/2008/09/26/8965755.aspx in The Old New Thing blog.
And then try this excerpts..