我正在尝试从批处理文件 run_process.bat
中调用 Run_sqlldr_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
用返回代码1
退出,分配给环境变量RC
。但是run_process.bat
不会从run_sqlldr_process.bat
捕获错误返回代码。echo
语句输出0
和run_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
为什么错误调用批处理文件在我的批处理文件中无法正常工作后处理错误?
我已经重写了您的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:JDABatch_FWKfwk"
SET "FWK_DIR=C:SOMEDIRECTORY"
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