如果jar文件归档失败,如何检测错误



我面临一个问题,其中%errorlevel%返回值为0,即使归档jar文件失败。

我想要实现的是在生产环境中存档日志文件。我使用ROBOCOPY命令将日志文件复制到一个单独的文件夹中,并尝试存档这些日志文件。"verify> null "用于将%errorlevel%重置为0,因为自动复制在执行后会将值设置为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 %%HNUL (
            ECHO [error] Directory "%%H" not exist!
            GOTO ERROR
        )
        SET APP_LOG_DIR_ORI=%%H
    )
    IF "%%G"=="log.server.dir.ori" (
        IF NOT EXIST %%HNUL (
            ECHO [error] Directory "%%H" not exist!
            GOTO ERROR
        )
        SET SERVER_LOG_DIR_ORI=%%H
    )
    IF "%%G"=="log.batch.dir.ori" (
        IF NOT EXIST %%HNUL (
            ECHO [error] Directory "%%H" not exist!
            GOTO ERROR
        )
        SET BATCH_LOG_DIR_ORI=%%H
    )
    IF "%%G"=="log.app.dir.dest" (
        IF NOT EXIST %%HNUL (
            ECHO [error] Directory "%%H" not exist!
            GOTO ERROR
        )
        SET APP_LOG_DIR_DEST=%%H
    )
    IF "%%G"=="log.server.dir.dest" (
        IF NOT EXIST %%HNUL (
            ECHO [error] Directory "%%H" not exist!
            GOTO ERROR
        )
        SET SERVER_LOG_DIR_DEST=%%H
    )
    IF "%%G"=="log.batch.dir.dest" (
        IF NOT EXIST %%HNUL (
            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命令

任何提示如何检测是否发生错误?

谢谢。

使用延迟展开

SETLOCAL EnableDelayedExpansion
...
    IF !errorlevel! NEQ 0 GOTO ERROR

确保在括号作用域中修改的所有变量都这样做。

在括号作用域()内展开变量时,变量将被展开为作用域开始前的值,除非使用延迟展开或变通方法进行扩展。

插图
@echo off
setlocal EnableDelayedExpansion
set "x=0"
echo %x%
if 1==1 (
    set "x=1"
    echo %x%
)
endlocal

作为David方法(使用延迟扩展)的替代方法,我支持+1,您可以使用 if errorlevel命令代替。我也会这样做的。

if errorlevel 1 goto error

阅读Raymond Chen在The Old New Thing博客中的条目ERRORLEVEL不是%ERRORLEVEL% http://blogs.msdn.com/b/oldnewthing/archive/2008/09/26/8965755.aspx。

然后试试这个摘录..

robocopy %ORI% %DEST% *.log ....
if errorlevel 2 goto error
...
if exist *.log ( 
   jar -cvMf ..
   if errorlevel 1 goto error
   for %%a in *.log do (
     del %%a ....
     if errorlevel 1 goto error
   )
)

最新更新