我面临一个问题,即使 jar 文件的存档失败,%errorlevel% 返回值也为 0。
我想要实现的是在生产环境中归档日志文件。我使用 ROBOCOPY 命令将日志文件复制到单独的文件夹并尝试归档这些日志文件。"verify > nul" 用于将 %errorlevel% 重置回 0,因为 robocopy 会在执行后将该值设置为 1。
但是,当 jar 命令执行过程中发生错误时(即没有要归档的文件),%errorlevel% 保持为 0,程序继续。
@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
注意:变量是从属性文件中读取的。不允许安装第三方库,因此我选择使用 jar 命令
任何提示如何检测是否发生错误?
谢谢。