首页 > 解决方案 > 为什么调用批处理文件后的错误处理无法在我的批处理文件中按预期工作?

问题描述

我正在尝试Run_sqlldr_process.bat从批处理文件中调用run_process.bat

这是调用调用的方式run_process.bat

call %FWK_DIR%\run_sqlldr_process.bat !ldr!.ctl !log!.log !bad!.bad !data!.dat %BATCHUSER% %BATCHPWD% %ORACLE_SID%
echo %ERRORLEVEL%
echo %RC%

内部发生故障run_sqlldr_process.bat,然后以分配给环境变量run_sqlldr_process.bat的返回码退出。但不会从. 两个语句都输出并成功完成。1RCrun_process.batrun_sqlldr_process.batecho0run_process.bat

文件Run_sqlldr_process.bat

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

REM ##########################################################################
REM # Program Name: run_process.bat
REM # Description:
REM #   This script is a part of the batch framework. It contains the common
REM #   functions for running batch jobs.
REM #
REM # Usage:
REM #   run_process.bat <processname>
REM #
REM # History:
REM # Date        Who                 Description
REM # ----------  ------------------  ----------------------------------------
REM # 01-Jun-2014  Ilavarasan Sekar      Created
REM ##########################################################################

SET NLS_DATE_FORMAT=RRRR-MM-DD-HH24:MI

FOR /F "TOKENS=1* DELIMS= " %%A IN ('DATE/T') DO SET CDATE=%%B
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B
FOR /F "TOKENS=2,3 DELIMS=/ " %%A IN ('echo %CDATE%') DO SET yyyy=%%B
SET todaysdate=%yyyy%%mm%%dd%
SET WORKFLOWLOGMONTH=%mm%%yyyy%
SET DATETIMESTAMP=%todaysdate%
for /f "tokens=1-3 delims=:." %%a in ("%time%") do SET timestamp=%%a%%b%%c
for /f "tokens=1-3 delims= " %%a in ("%timestamp%") do SET trimmed_timestamp=%%a%%b%%c
SET TIMESTAMP=%DATETIMESTAMP%_%trimmed_timestamp%


rem --- Initialize --------------------------------------------
rem Install error handler.
rem basename=$(basename $0)
SET dirname=D:/JDA/Batch_FWK/fwk
echo off
SET oldpwd=%~dp0
SET suffix=%date%

SET process_id=%1
SET job_id=
SET process_type=
SET preprocess_type=
SET postprocess_type=
SET job_status=CREATED
SET job_status_message=
SET log_level=INFO
SET pre=

if "%1" == "" goto show_usage

rem --- Include environment variables -------------------------
SET batchenv=%dirname%\batchenv.bat
if exist %batchenv% (

    call %batchenv%

 ) else (
  echo "Environment file missing.\n"
  goto end
)

set LOG_FILE=%LOG_DIR%\%process_id%_%TIMESTAMP%.log
set TMP_FILE=%TMP_DIR%\%process_id%_%TIMESTAMP%.tmp


rem --- Start job ---------------------------------------------

call:start_job

IF "%preprocess_type%"=="SQL" (

  call:log_info "SQL."
  SET pre=%SQL_DIR%\%process_id%_pre
  call %FWK_DIR%\run_sql_process.bat !pre!.sql

) ELSE IF "%preprocess_type%"=="CMD" (

   call:log_info "CMD."
   SET pre=%CMD_DIR%\%process_id%_pre
   call %FWK_DIR%\run_cmd_process.bat !pre!.bat 

) ELSE (
  call:log_info "No postprocess_type."

)

IF %ERRORLEVEL% GTR 0 (
    set job_status=FAILED
    call:end_job
    call:cleanup
    set RC=1
    goto end 

 )


rem --- Execute main process ----------------------------------

IF "%process_type%"=="SQL" (

   call:log_info "SQL."

   SET main=%SQL_DIR%\%process_id%
   call %FWK_DIR%\run_sql_process.bat !main!.sql

) ELSE IF "%process_type%"=="CMD" (

  call:log_info "CMD."
  SET main=%CMD_DIR%\%process_id%
  call %FWK_DIR%\run_cmd_process.bat !main!.bat

) ELSE IF "%process_type%"=="SRE" (

  call:log_info "SRE."
  SET main=%XML_DIR%\%process_id%
  call %FWK_DIR%\run_sre_process.bat !main!.xml

) ELSE IF "%process_type%"=="PERL" (

  call:log_info "PERL."
  SET main=%PRL_DIR%\%process_id%
  call %FWK_DIR%\run_perl_process.bat !main!.pl

) ELSE IF "%process_type%"=="SQLLDR" (

  call:log_info "SQLLDR."
  SET ldr=%CTL_DIR%\%process_id%
  SET log=%LOG_DIR%\%process_id%_%TIMESTAMP%
  SET bad=%BAD_DIR%\%process_id%_%TIMESTAMP%
  SET data=%IN_DIR%\%process_id%
  call %FWK_DIR%\run_sqlldr_process.bat !ldr!.ctl !log!.log !bad!.bad !data!.dat %BATCHUSER% %BATCHPWD% %ORACLE_SID%
  echo Return Code ERRORLEVEL inside run_process is %ERRORLEVEL%
  echo Return Code inside run_process.bat  is %RC%


IF %RC% GTR 0 (
    ECHO INSIDE FAILED BLOCK
    set job_status=FAILED
    set RC=1
    call:end_job
    call:cleanup
    goto end 
 )

) ELSE (
  call:log_info "Unsupported process type %process_type%."
    set job_status=FAILED
    set RC=1
    call:end_job
    call:cleanup
    goto end
)

IF %ERRORLEVEL% GTR 0 (
    set job_status=FAILED
    set RC=1
    call:end_job
    call:cleanup
    goto end 
 )


IF "%postprocess_type%"=="SQL" (

    call:log_info "SQL."
    SET post=%SQL_DIR%\%process_id%_post
    call %FWK_DIR%\run_sql_process.bat !post!.sql
) ELSE IF "%postprocess_type%"=="CMD" (

  call:log_info "CMD."
   SET post=%CMD_DIR%\%process_id%_post
   call %FWK_DIR%\run_cmd_process.bat !post!.bat    

) ELSE (

  call:log_info "No postprocess_type."
)

IF %ERRORLEVEL% GTR 0 (
    set job_status=FAILED
    set RC=1
    call:end_job
    call:cleanup
    goto end 
 )


rem --- End job -------------------------------------------------

call:end_job
call:cleanup
goto end 


:show_usage

@echo Usage: Usage is run_process.bat ProcessName

goto end

rem --- Function definitions ----------------------------------
rem -----------------------------------------------------------
rem Function Name: start_job
rem Description  :
rem   Retrieve process properties and start a new job for
rem   the specified process.
rem Input        : process_id - Process to start.
rem Output       : job_id - New job id set.
rem -----------------------------------------------------------

:start_job
  call:log_info "--- Starting -----------------------------------"
  call:log_info "Process          : %process_id%"
  call:log_info "Environment      : %ENV_NAME%"
  call:log_info "Batch root       : %ENV_HOME%"
  call:log_info "Log file         : %LOG_FILE%"
  call:log_info "Tmp file         : %TMP_FILE%"

  sqlplus -s /nolog @%dirname%/sqlFile.sql '%BATCHUSER%' '%BATCHPWD%' '%ORACLE_SID%' '%process_id%'

  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^JOB_ID" %tmp_file%') do set JOB_ID=%%a
  for /f "tokens=1,*" %%a in ("%JOB_ID%") do set JOB_ID=%%a
  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^PROCESS_TYPE" %tmp_file%') do set PROCESS_TYPE=%%a
  for /f "tokens=1,*" %%a in ("%PROCESS_TYPE%") do set PROCESS_TYPE=%%a
  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^PREPROCESS_TYPE" %tmp_file%') do set PREPROCESS_TYPE=%%a
  for /f "tokens=1,*" %%a in ("%PREPROCESS_TYPE%") do set PREPROCESS_TYPE=%%a
  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^POSTPROCESS_TYPE" %tmp_file%') do set POSTPROCESS_TYPE=%%a
  for /f "tokens=1,*" %%a in ("%POSTPROCESS_TYPE%") do set POSTPROCESS_TYPE=%%a
  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^LOG_LEVEL" %tmp_file%') do set LOG_LEVEL=%%a
  for /f "tokens=1,*" %%a in ("%LOG_LEVEL%") do set LOG_LEVEL=%%a

  set job_status=RUNNING
  del /q %TMP_FILE% 

  IF "%job_id%" == ""  (
    set job_status=FAILED
    call:cleanup
    set RC=1
    goto end 
 )

  call:log_info "Job id           : %job_id%"
  call:log_info "Process type     : %process_type%"
  call:log_info "Pre-process type : %preprocess_type%"
  call:log_info "Post-process type: %postprocess_type%"
  call:log_info "--- Running ------------------------------------"  
 goto:eof

rem -----------------------------------------------------------
rem Function Name: end_job
rem Description  :
rem   End the current job.
rem Input        : job_id
rem Output       : N/A
rem -----------------------------------------------------------
:end_job

  call:log_info "--- Ending -------------------------------------"


 sqlplus -s /nolog @%dirname%/sqlFileEnd.sql '%BATCHUSER%' '%BATCHPWD%' '%ORACLE_SID%' '%job_id%' '%job_status%'

  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^JOB_STATUS|" %tmp_file%') do set JOB_STATUS=%%a
  for /f "tokens=1,*" %%a in ("%JOB_STATUS%") do set JOB_STATUS=%%a
  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^JOB_STATUS_MESSAGE" %tmp_file%') do set JOB_STATUS_MESSAGE=%%a
  for /f "tokens=1,*" %%a in ("%JOB_STATUS_MESSAGE%") do set JOB_STATUS_MESSAGE=%%a
  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^JOB_VOLUME" %tmp_file%') do set JOB_VOLUME=%%a
  for /f "tokens=1,*" %%a in ("%JOB_VOLUME%") do set JOB_VOLUME=%%a
  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^JOB_ERROR_COUNT" %tmp_file%') do set JOB_ERROR_COUNT=%%a
  for /f "tokens=1,*" %%a in ("%JOB_ERROR_COUNT%") do set JOB_ERROR_COUNT=%%a
  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^JOB_WARNING_COUNT" %tmp_file%') do set JOB_WARNING_COUNT=%%a
  for /f "tokens=1,*" %%a in ("%JOB_WARNING_COUNT%") do set JOB_WARNING_COUNT=%%a

   del /q %TMP_FILE% 
  call:log_info "Job status       : %job_status%"
  call:log_info "Job status msg   : %job_status_message%"
  rem call:log_info "Volume           : %job_volume%"
  call:log_info "Error count      : %job_error_count%"
  call:log_info "Warning count    : %job_warning_count%"    


goto:eof

rem -----------------------------------------------------------
rem Function Name: fatal
rem Description  :
rem   Error handler called called by trap on error etc.
rem   Handle clean up and exit with error.
rem Input        : Return code from failed command in ?.
rem Output       : N/A
rem -----------------------------------------------------------



rem -----------------------------------------------------------
rem Function Name: clear
rem Description  :
rem   Handle clean up.
rem Input        : N/A
rem Output       : N/A
rem -----------------------------------------------------------
:cleanup 

 if not '%job_status%' == 'COMPLETED' (
 call:log_info "--------- Ended with failure -------------------------"
 ) else (
 call:log_info "----------------------- End --------------------------"
 )
goto:eof


rem -----------------------------------------------------------
rem Function Name: log_info
rem Description  :
rem   Write information to log file and stdout.
rem Input        : 1 - Message to log.
rem Output       : N/A
rem -----------------------------------------------------------
:log_info

  set stamp=%TIMESTAMP%
  rem echo [INFO.][%stamp%] %1
  rem echo.
  rem echo %LOG_FILE%
  echo [INFO.][%stamp%] %1 >> %LOG_FILE%
  echo. >> %LOG_FILE%

goto:eof

:end
exit /b %RC%
endlocal

为什么调用批处理文件后的错误处理无法在我的批处理文件中按预期工作?

标签: batch-file

解决方案


我已经重新编写了你的​​ CMD 脚本,使其更加紧凑,并且我放入了一个变量来设置 FWK 变量,还有其他正在设置的变量没有被使用我从这里删除了许多变量,并且有您没有从任何地方设置的其他脚本变量我可以找到,也许它们来自其他 .bat 文件?>

让我们在聊天中更详细地讨论这个问题,因为有几个未知数,我显然不能自己测试这个,因为它在很大程度上取决于您拥有的自定义脚本。

:: ##########################################################################
:: # Program Name: run_process.bat
:: # Description:
:: #   This script is a part of the batch framework. It contains the common
:: #   functions for running batch jobs.
:: #
:: # Usage:
:: #   run_process.bat <processname>
:: #
:: # History:
:: # Date        Who                 Description
:: # ----------  ------------------  ----------------------------------------
:: # 01-Jun-2014  Ilavarasan Sekar      Created
:: ##########################################################################
::


@(
  echo off
  SETLOCAL ENABLEDELAYEDEXPANSION
  SET "_eLvl=0"
  IF /I "%1" EQU "" (
    CALL :Show_Usage
    Exit /B 1
  )
  REM ENTER YOUR DIRECTORIES
  SET "dirname=D:\JDA\Batch_FWK\fwk"
  SET "FWK_DIR=C:\SOME\DIRECTORY"

  REM If Batch Environment Bat File is missing Quit!  Otherwise load it and continue
  SET "batchenv=!dirname!\batchenv.bat"
  IF NOT EXIST "!batchenv!" (
    ECHO Environment file !batchenv!" is missing.
    Exit /B 1
  )
  CALL "!batchenv!"
  SET "_Write-Info=call :log_info "
)

CALL :Main

(
  ENDLOCAL
  EXIT /B %_eLvl%
)


:Main


  CALL :Initialize_Variables

    rem --- Start job ---------------------------------------------

  call :start_job

  FOR %A IN (
    Step1
    Step2
    Step3
  ) DO (
    IF /I !_eLvl! LEQ 0 (
      ECHO. Running :%%A
      CALL :%%A
    ) ELSE (
      ECHO Error Occured!  Skipping :%%A
    )
  )

  IF !_eLvl! GTR 0 (
    SET "job_status=FAILED"
  )

  rem --- End job -------------------------------------------------
  call :end_job

GOTO :EOF


:Initialize_Variables
  rem --- Initialize --------------------------------------------

  REM SET "NLS_DATE_FORMAT=RRRR-MM-DD-HH24:MI"

  REM --- Set up the Date Variable
  FOR /F "Tokens=1-7 delims=MTWFSmtwfsouehrandit:-\/. " %%A IN ("%DATE% %TIME: =0%") DO (
    FOR /F "Tokens=2-4 Skip=1 Delims=(-)" %%a IN ('ECHO.^| DATE') DO (
      SET "_%%~a=%%~A"
      SET "_%%~b=%%~B"
      SET "_%%~c=%%~C"
      SET "TIMESTAMP=!_YY!!_mm!!_dd!_%%~D%%~E%%~F"
    )
  )

  REM Setup Logs:
  SET "LOG_FILE=%LOG_DIR%\%process_id%_%TIMESTAMP%.log"
  SET "TMP_FILE=%TMP_DIR%\%process_id%_%TIMESTAMP%.tmp"

  rem Install error handler.
  rem basename=$(basename $0)

  REM Setup the Process Info and default variable States
  SET "process_id=%1"
  SET "job_id="
  SET "process_type="
  SET "preprocess_type="
  SET "postprocess_type="
  SET "job_status=CREATED"
  SET "job_status_message="
  SET "log_level=INFO"
  SET "pre="

GOTO :EOF



:show_usage
  @echo Usage: Usage is run_process.bat ProcessName
GOTO :EOF

:start_job
  rem --- Function definitions ----------------------------------
  rem -----------------------------------------------------------
  rem Function Name: start_job
  rem Description  :
  rem   Retrieve process properties and start a new job for
  rem   the specified process.
  rem Input        : process_id - Process to start.
  rem Output       : job_id - New job id set.
  rem -----------------------------------------------------------

  %_Write-Info%"--- Starting -----------------------------------"
  %_Write-Info%"Process          : %process_id%"
  %_Write-Info%"Environment      : %ENV_NAME%"
  %_Write-Info%"Batch root       : %ENV_HOME%"
  %_Write-Info%"Log file         : "%LOG_FILE%""
  %_Write-Info%"Tmp file         : "%TMP_FILE%" "

  sqlplus -s /nolog @"%dirname%/sqlFile.sql" '%BATCHUSER%' '%BATCHPWD%' '%ORACLE_SID%' '%process_id%'

  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^JOB_ID" "%TMP_FILE%" ') do SET "JOB_ID=%%a"
  for /f "tokens=1,*" %%a in ("%JOB_ID%") do SET "JOB_ID=%%a"
  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^PROCESS_TYPE" "%TMP_FILE%" ') do SET "PROCESS_TYPE=%%a"
  for /f "tokens=1,*" %%a in ("%PROCESS_TYPE%") do SET "PROCESS_TYPE=%%a"
  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^PREPROCESS_TYPE" "%TMP_FILE%" ') do SET "PREPROCESS_TYPE=%%a"
  for /f "tokens=1,*" %%a in ("%PREPROCESS_TYPE%") do SET "PREPROCESS_TYPE=%%a"
  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^POSTPROCESS_TYPE" "%TMP_FILE%" ') do SET "POSTPROCESS_TYPE=%%a"
  for /f "tokens=1,*" %%a in ("%POSTPROCESS_TYPE%") do SET "POSTPROCESS_TYPE=%%a"
  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^LOG_LEVEL" "%TMP_FILE%" ') do SET "LOG_LEVEL=%%a"
  for /f "tokens=1,*" %%a in ("%LOG_LEVEL%") do SET "LOG_LEVEL=%%a"

  SET "job_status=RUNNING"
  del /q "%TMP_FILE% ""

  IF "%job_id%" == ""  (
    SET "job_status=FAILED"
    SET "_eLvl=1"
 )

  %_Write-Info%"Job id           : %job_id%"
  %_Write-Info%"Process type     : %process_type%"
  %_Write-Info%"Pre-process type : %preprocess_type%"
  %_Write-Info%"Post-process type: %postprocess_type%"
  %_Write-Info%"--- Running ------------------------------------"  
 goto :eof

:Step1
  (
    ECHO."SQL CMD" | FIND /I /V "%preprocess_type%" (
    ) && (
      %_Write-Info%"No Prerocess_type."
    )
  ) || (
    CALL SET "pre=!%preprocess_type%_DIR!\%process_id%_pre"
    CALL "%FWK_DIR%\run_sql_process.bat" "!pre!.%preprocess_type%"
  )

  SET "_eLvl=%ERRORLEVEL%"
GOTO :EOF

:Step2
  rem --- Execute main process ----------------------------------
  SET "_Valid_Procs=SQL CMD SRE PERL SQLLDR"
  SET "_SQL.Ext=SQL"
  SET "_CMD.Ext=CMD"
  SET "_Perl.Ext=pl"
  SET "_SRE.Ext=xml"

  rem Check is valid Process Type

  ECHO."%_Valid_Procs%" | FIND /I /V "%process_type%" >NUL && (
    %_Write-Info%"Unsupported process type %process_type%."
    SET "job_status=FAILED"
    SET "_eLvl=1"
    GOTO :EOF
  )
  IF /I "%process_type%" EQU "SQLLDR" (
      %_Write-Info%"SQLLDR."
      SET "ldr=%CTL_DIR%\%process_id%"
      SET "log=%LOG_DIR%\%process_id%_%TIMESTAMP%"
      SET "bad=%BAD_DIR%\%process_id%_%TIMESTAMP%"
      SET "data=%IN_DIR%\%process_id%"
      CALL SET "FWK_CMD=%FWK_DIR%\run_SQLLDR_process.bat" !ldr!.ctl !log!.log !bad!.bad !data!.dat %BATCHUSER% %BATCHPWD% %ORACLE_SID%"
  ) ELSE (
    FOR %%A IN (
      %_Valid_Procs%"
    ) DO (
      %_Write-Info%"%%A."
      CALL SET "FWK_CMD="%FWK_DIR%\run_%%A_process.bat" "Main=!%%A_DIR!\%process_id%.!_%%A.ext!""
    )
  )

  %_Write-Info% Running: %FWK_CMD%
  call "%FWK_CMD%"

  SET "_eLvl=%ERRORLEVEL%"
GOTO :EOF

:Step3

  (
    ECHO."SQL CMD" | FIND /I /V "%postprocess_type%" (
    ) && (
      %_Write-Info%"No Prerocess_type."
    )
  ) || (
    CALL SET "pre=!%preprocess_type%_DIR!\%process_id%_post"
    CALL "%FWK_DIR%\run_%preprocess_type%_process.bat" "!pre!.%preprocess_type%"
  )

  SET "_eLvl=%ERRORLEVEL%"
GOTO :EOF




:end_job
  rem -----------------------------------------------------------
  rem Function Name: end_job
  rem Description  :
  rem   End the current job.
  rem Input        : job_id
  rem Output       : N/A
  rem -----------------------------------------------------------
  %_Write-Info%"--- Ending -------------------------------------"


 sqlplus -s /nolog @%dirname%/sqlFileEnd.sql '%BATCHUSER%' '%BATCHPWD%' '%ORACLE_SID%' '%job_id%' '%job_status%'

  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^JOB_STATUS|" "%TMP_FILE%" ') do SET "JOB_STATUS=%%a"
  for /f "tokens=1,*" %%a in ("%JOB_STATUS%") do SET "JOB_STATUS=%%a"
  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^JOB_STATUS_MESSAGE" "%TMP_FILE%" ') do SET "JOB_STATUS_MESSAGE=%%a"
  for /f "tokens=1,*" %%a in ("%JOB_STATUS_MESSAGE%") do SET "JOB_STATUS_MESSAGE=%%a"
  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^JOB_VOLUME" "%TMP_FILE%" ') do SET "JOB_VOLUME=%%a"
  for /f "tokens=1,*" %%a in ("%JOB_VOLUME%") do SET "JOB_VOLUME=%%a"
  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^JOB_ERROR_COUNT" "%TMP_FILE%" ') do SET "JOB_ERROR_COUNT=%%a"
  for /f "tokens=1,*" %%a in ("%JOB_ERROR_COUNT%") do SET "JOB_ERROR_COUNT=%%a"
  for /f "tokens=2 delims=|" %%a in ('findstr /R /I "^JOB_WARNING_COUNT" "%TMP_FILE%" ') do SET "JOB_WARNING_COUNT=%%a"
  for /f "tokens=1,*" %%a in ("%JOB_WARNING_COUNT%") do SET "JOB_WARNING_COUNT=%%a"

   del /q "%TMP_FILE%"
  %_Write-Info%"Job status       : %job_status%"
  %_Write-Info%"Job status msg   : %job_status_message%"
  rem %_Write-Info%"Volume           : %job_volume%"
  %_Write-Info%"Error count      : %job_error_count%"
  %_Write-Info%"Warning count    : %job_warning_count%"    

  CALL :Cleanup

goto :eof






:cleanup 
   rem -----------------------------------------------------------
   rem Function Name: clear
   rem Description  :
   rem   Handle clean up.
   rem Input        : N/A
   rem Output       : N/A
   rem -----------------------------------------------------------
  if not '%job_status%' == 'COMPLETED' (
    %_Write-Info%"--------- Ended with failure -------------------------"
  ) else (
    %_Write-Info%"----------------------- End --------------------------"
  )
goto :eof



:log_info
  rem -----------------------------------------------------------
  rem Function Name: log_info
  rem Description  :
  rem   Write information to log file and stdout.
  rem Input        : 1 - Message to log.
  rem Output       : N/A
  rem -----------------------------------------------------------
  SET "stamp=%TIMESTAMP%"
  rem echo [INFO.][%stamp%] %1
  rem echo.
  rem echo "%LOG_FILE%"
  echo.[INFO.][%stamp%] %*>> "%LOG_FILE%"
  echo.>> "%LOG_FILE%"
goto :eof

推荐阅读