Я создал пакетную переменную для пути данных mysql (wamp):
set MYSQLDATAPATH="%HOMEDRIVE%\wamp\bin\mysql\mysql5.7.21\data"
or
set MYSQLDATAPATH="%HOMEDRIVE%\wamp64\bin\mysql\mysql5.7.21\data"
И он изменяется в соответствии с версией (mysql-wamp и x86/x64):
set MYSQLDATAPATH="%HOMEDRIVE%\wamp\bin\mysql\mysql5.7.19\data"
or
set MYSQLDATAPATH="%HOMEDRIVE%\wamp64\bin\mysql\mysql5.7.19\data"
так далее...
Как создать (в пакете) одну переменную, которая задает путь данных для mysql wamp (MYSQLDATAPATH), независимо от версии (wampXX и mysqlXX)
Спасибо!
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "mysqldatapath="
FOR %%a IN (wamp wamp64) DO (
FOR /f %%d IN ('dir /ad /b "%sourcedir%\%%a\bin\mysql\mysql*" 2^>nul') DO (
IF exist "%sourcedir%\%%a\bin\mysql\%%d\data" (
SET "candidate=%sourcedir%\%%a\bin\mysql\%%d"
CALL :latest %%d
)
)
)
ECHO mysqldatapath=%mysqldatapath%
GOTO :EOF
:: latest version required? Format %1 may be mysqlA.C.E or mysqlAB.CD.EF
:latest
IF NOT defined mysqldatapath GOTO newver
:: is newly-detected version in %1 preferred to %sql_ver%?
SET "new_ver=%1"
:: remove "mysql"
SET "new_ver=%new_ver:~5%"
:: replace '.' with ' '
SET "new_ver=%new_ver:.= %"
CALL :vcompare %sql_ver% %new_ver%
:: :vcompare will clear 'new_ver' if new version is preferred
IF NOT DEFINED new_ver GOTO :eof
:newver
SET "mysqldatapath=%candidate%"
SET "sql_ver=%1"
:: remove "mysql"
SET "sql_ver=%sql_ver:~5%"
:: replace '.' with ' '
SET "sql_ver=%sql_ver:.= %"
GOTO :eof
:: version comparison. old old old new new new as 1 or 2-digit
:vcompare
IF "%4"=="" GOTO :EOF
SET "v_1=0000%1"
SET "v_4=0000%4"
SET /a v_1=1%v_1:~-3%
SET /a v_4=1%v_4:~-3%
IF %v_1%==%v_4% shift&GOTO vcompare
IF %v_1% gtr %v_4% SET "new_ver="
GOTO :eof
Вам нужно будет изменить настройку sourcedir
в соответствии с вашими обстоятельствами.
Не так просто, как можно ожидать. Трудная часть заключается в выборе нужной версии у кандидатов.
Первый блок ищет wamp
а затем wamp64
для каталога с именем mysql*
а затем назначает кандидата, если каталог mysql*
содержит data
. :latest
процедура проверяет номера версий и выбирает последнюю для назначения mysqldatapath
.
:latest
устанавливают new_ver
на найденный номер версии, например. 5.7.19 и преобразует это в 5 7 19
. Процедура :vcompare
затем выполняет механику сравнения трех уровней, заботясь о потенциальном :vcompare
нуле на каждом уровне. Обратите внимание, что попытка сравнения с использованием литералов здесь потерпит неудачу, так как 5.10.01
будет меньше 5.9.99
если сравнивать как литерал, но на самом деле это более поздняя (и, следовало ожидать, большая) версия.
u:\sourcedir
является реальным примером. Это каталог, который я использую для тестирования решений, которые я публикую на SO. Если вы установите для sourcedir
значение %HOMEDRIVE%
которое подходит для ваших настроек, все должно работать без сбоев. Обратите внимание, однако, как я использую кавычки. Это общепринятый способ SO для преодоления проблем, связанных с конечными пробелами в строках, и позволяет избежать требуемой гимнастики, объединяющей переменные, которые указывают значения