:: ################################################################## :: # :: # MicroFocus Fortify SCA 분석 배치 순차실행 스크립트 :: # :: # 이 스크립트는 PROJECT_BAT에 정의된 배치파일을 순차적으로 :: # 실행하며 모든 배치파일의 실행이 완료될 경우 다시 처음부터 :: # 무한 루핑하여 실행한다. :: # :: # 또한 Sleeping time을 정의하여 업무시간에는 구동이 되지 :: # 않도록 설정할 수 있다. :: # :: # 작성자: 이존석 (hasu0707@gmail.com) :: # :: ################################################################## @cls @echo off :: ################################################################## :: # Project ID에 대응하는 배치파일 배열 (배열의 첨자로 구분한다) :: ################################################################## set "PROJECT_BAT[0]=D:\desktop\batch\test1.bat" set "PROJECT_BAT[1]=D:\desktop\batch\test2.bat" set "PROJECT_BAT[2]=D:\desktop\batch\test3.bat" setlocal enableextensions enabledelayedexpansion :: ################################################################## :: # :: # 기본 변수 셋팅 :: # :: # START_INDEX: 몇번 배치부터 실행할 것인가 ? :: # TIME_CHECK: 1이면 SLEEP시간 체크 0이면 무조건 진행 :: # SLEEP_START_TIME: SLEEP 시작 시간 (00~23시:00~59분:00~59초) :: # SLEEP_END_TIME: SLEEP 마감 시간 (00~23시:00~59분:00~59초) :: # INTERVAL_SEC: 배치 하나 실행 후 잠시 쉬는 시간 (초) :: # LOG_FILE: 로그 파일 :: # :: ################################################################## set /A "START_INDEX=0" set /A "TIME_CHECK=1" set "SLEEP_START_TIME=09:00:00" set "SLEEP_END_TIME=18:00:00" set /A "INTERVAL_SEC=30" set "LOG_FILE=test.log" set /A "x=%START_INDEX%" :: ################################################################## :: # 전체 배치파일의 갯수를 센다. :: ################################################################## set /A "i=0" :Label_Index_Count if defined PROJECT_BAT[%i%] ( set /A "i+=1" goto :Label_Index_Count ) set /A INDEX_COUNT=%i% :: ################################################################## :: # 무한루프 시작 :: ################################################################## :Infinite_Loop set /A "RUN_BATCH=1" if %x% geq %INDEX_COUNT% ( SET /A "x=0" ) :: ################################################################## :: # 현재 시간을 구한다. :: ################################################################## call :getTime TIME_NOW :: ################################################################## :: # 현재 요일을 1~7의 숫자로 구한다. :: ################################################################## for /F "skip=2 tokens=2-4 delims=," %%A in ('WMIC Path Win32_LocalTime Get DayOfWeek /Format:csv') do set DAYNUMBER=%%A :: ################################################################## :: # 배치를 실행 할지 말지 결정한다. :: ################################################################## if %TIME_CHECK% == 1 ( if %DAYNUMBER% geq 6 ( goto Label_Main ) if "%TIME_NOW%" geq "%SLEEP_START_TIME%" ( if "%TIME_NOW%" lss "%SLEEP_END_TIME%" ( set /A "RUN_BATCH=0" echo [%x%] Sleeping time: %SLEEP_START_TIME% ~ %SLEEP_END_TIME% ) ) ) :Label_Main if %RUN_BATCH% == 1 ( echo. echo ################################################# echo TIME_CHECK:%TIME_CHECK% / INDEX: %x% echo Batch file: !PROJECT_BAT[%x%]! echo Current Time: %TIME_NOW%, Day of Week: %DAYNUMBER% echo ################################################# call %%PROJECT_BAT[%x%]%% echo %DATE% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2% !PROJECT_BAT[%x%]! 1>> %LOG_FILE% ) :Label_Next SET /A "x+=1" :: ################################################################## :: # Run interval :: ################################################################## ping 127.0.0.1 -n %INTERVAL_SEC% > nul :: ################################################################## :: # 무한루프 끝 :: ################################################################## goto :Infinite_Loop endlocal exit /b :: ################################################################## :: # :: # getTime :: # :: # 이 함수는 hh:mm:ss의 24시간 포맷으로 현재 시간을 반환한다. :: # ex) call :getTime now : %now% 변수로 현재 시간이 반환된다. :: # :: ################################################################## :getTime returnVar [time] setlocal enableextensions disabledelayedexpansion :: Retrieve parameters if present. Else take current time if "%~2"=="" ( set "t=%time%" ) else ( set "t=%~2" ) :: Test if time contains "correct" (usual) data. Else try something else echo(%t%|findstr /i /r /x /c:"[0-9:,.apm -]*" >nul || ( set "t=" for /f "tokens=2" %%a in ('2^>nul robocopy "|" . /njh') do ( if not defined t set "t=%%a,00" ) rem If we do not have a valid time string, leave if not defined t exit /b ) :: Check if 24h time adjust is needed if not "%t:pm=%"=="%t%" (set "p=12" ) else (set "p=0") :: Separate the elements of the time string for /f "tokens=1-5 delims=:.,-PpAaMm " %%a in ("%t%") do ( set "h=%%a" & set "m=00%%b" & set "s=00%%c" & set "c=00%%d" ) :: Adjust the hour part of the time string set /a "h=100%h%+%p%" :: Clean up and return the new time string :: endlocal & if not "%~1"=="" set "%~1=%h:~-2%:%m:~-2%:%s:~-2%,%c:~-2%" & exit /b endlocal & if not "%~1"=="" set "%~1=%h:~-2%:%m:~-2%:%s:~-2%" & exit /b