2015-02-19 1 views
0

Итак, я пытаюсь создать пакетный файл, который я могу выполнить, чтобы обновлять несколько баз данных с помощью sql-файлов. Я уже создал первую часть, которая выполняет sql-файлы во всех базах данных. Это не очень сложно, но это делает работу. Моя проблема в том, что все файлы всегда выполняются.Пакетный скрипт: обновить базу данных новыми sql-файлами

То, что я хотел бы иметь, - это проверка между датой/временем исполнения командного сценария и последней измененной датой/временем каждого сценария sql. Благодаря этому я могу выполнять только sql-скрипты, которые были изменены/созданы после выполнения пакетного скрипта. Я пробовал довольно много, но мне не удалось запустить эту функцию. Я не очень хорош с пакетными сценариями ^^

Спасибо!

Сценарий

@echo off 

set "mySQLexe=C:\wamp\bin\mysql\mysql5.5.24\bin\mysql.exe" 
for /f "tokens=*" %%A in (databases.txt) do ( 
    for %%G in (*.sql) do ( 
     %mySQLexe% -hlocalhost -uroot %%A < %%G 
) 
) 
REM Save execution of batch file 
@echo %date% > executiontime.txt 
@echo %time% >> executiontime.txt 
+0

Показать существующий скрипт. Это не имеет никакого смысла для меня. –

+0

'@echo от для/ф "токенов = *" %% а в (databases.txt) делают ( \t для %% G в (* .sql) делают ( \t \t \t \t C: \ WAMP \ Bin \ MySQL \ mysql5.5.24 \ Bin \ mysql.exe -hlocalhost -uroot %% а <%% G \t) ) REM Сохранить выполнение пакетного файла @echo% дата%> executiontime.txt @echo% time% >> executetime.txt ' В файле базы данных есть список всех баз данных Я хочу выполнить sql-файлы. Теперь, прежде чем я заработаю эти файлы sql, я хочу проверить, если измененная дата более поздняя, ​​чем время выполнения пакетного скрипта, чтобы применить только файлы sql, которые еще не были выполнены. – user3314017

+0

Извините, я не нашла возможности для разрывов строк для кода – user3314017

ответ

0

Попробуйте это:

@echo off 
setlocal enabledelayedexpansion 
set "mySQLexe=C:\wamp\bin\mysql\mysql5.5.24\bin\mysql.exe" 
for /f "tokens=*" %%A in (databases.txt) do ( 
    for /f "tokens=*" %%G in ('dir /b *.sql') do ( 
    Call :FileModTime "%%G" sTime 
    Call :FileModTime "%%~dpf0" bTime 
    if !sTime! GTR !bTime! (
     echo %mySQLexe% -hlocalhost -uroot %%A < %%G 
    ) 
) 
) 
exit /b 

:FileModTime File [TimeVar] 
:: Created by dbenham from dostips :: 
:: Converts current time to epox time :: 
setlocal disableDelayedExpansion 
for %%F in ("%~1") do set "file=%%~fF" 
set "time=" 
for /f "skip=1 delims=,. tokens=2" %%A in (
    'wmic datafile where "name='%file:\=\\%'" get lastModified /format:csv 2^>nul' 
) do set "ts=%%A" 
set "ts=%ts%" 
if defined ts (
    set /a "yy=10000%ts:~0,4% %% 10000, mm=100%ts:~4,2% %% 100, dd=100%ts:~6,2% %% 100" 
    set /a "dd=dd-2472663+1461*(yy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yy+4900+(mm-14)/12)/100)/4" 
    set /a "ss=(((1%ts:~8,2%*60)+1%ts:~10,2%)*60)+1%ts:~12,2%-366100-%ts:~21,1%((1%ts:~22,3%*60)-60000)" 
    set /a "ts=ss+dd*86400" 
) 
endlocal & if "%~2" neq "" (set "%~2=%ts%") else echo(%ts% 

Удалить эхо, как только вы проверили его и убедились, что она работает.