Как получить номер последней версии с помощью пакета
У меня есть папка, которая содержит несколько подкаталогов
Формат версии Я хотел бы получить номер последней версии 16.0.0a2, используя пакетный скрипт. Я пишу такие коды, но не работает, потому что подкаталоги отсортированы в алфавитном порядке. Так что это даст результат 16.0.0d24.[major].[minor].[update][phase][build]
, лайк 1.0.0d0
, И допустимыми фазами являются d(ev), a(lpha), b(eta), f(inal), обратите внимание, d SET BASEPATH=.....
SET TEMPFILE=%TEMP%\%~n0%RANDOM%
echo get latest export.
DIR /A:D /B /ON "%BASEPATH%" > "%TEMPFILE%"
FOR /F "usebackq delims=;" %%I IN ("%TEMPFILE%") DO (SET LATEST_VERSION=%%I)
echo LATEST_VERSION
3 ответа
Следующий скрипт делает то, что вы хотите:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "LOC=%~1"
if not defined LOC set "LOC=."
set /A "PADV=100, PADB=10000"
set "SRCH=d" & set "REPL=@"
for /F "tokens=1,2,* delims=." %%A in ('
dir /B /A:D /O:D /T:C "%LOC%" ^| ^
findstr /I /R "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*[dabf][0-9][0-9]*"
') do (
set /A "MAJOR=%%A+PADV, MINOR=%%B+PADV"
for /F "tokens=1,* delims=DdAaBbFf" %%E in ("%%C") do (
set /A "FIX=%%E+PADV, BUILD=%%F+PADB"
set "PHASE=%%C" & set "PHASE=!PHASE:*%%E=!" & set "PHASE=!PHASE:~,1!"
set "PHASE=!PHASE:%SRCH%=%REPL%!"
)
set "VERSION[!MAJOR!.!MINOR!.!FIX!!PHASE!!BUILD!]=%%A.%%B.%%C"
)
for /F "tokens=2 delims==" %%V in ('2^> nul set VERSION[') do (
set "LATEST=%%V"
echo(%%V
)
if defined LATEST echo Latest: & echo(%LATEST%
endlocal
exit /B
Основная концепция состоит в том, чтобы адаптировать номера версий так, чтобы (буквенно-цифровая сортировка обеспечивала тот же результат, что и алфавитная сортировка). Это может быть достигнуто путем добавления большого числа к каждой числовой части номеров версий, чтобы каждый из них всегда имел одинаковое количество цифр. Кроме того, поскольку приоритет фазового рисунка не в алфавитном порядке, выполняются соответствующие замены.
Основная идея взята из этого ответа и зачислена Aacini.
Дата создания должна быть хорошим критерием для сортировки в этом случае:
...
echo get latest export.
FOR /F "delims=" %%I IN ('DIR /AD /B /OD /TC "%BASEPATH%"') DO SET "LATEST_VERSION=%%I"
echo %LATEST_VERSION%
dir
:-параметров/OD
сортировать по дате / времени/TC
выберите дату создания (вместо значения по умолчанию "дата последнего изменения")/AD
показывать только каталоги/B
показать только имена, без заголовка, без размеров, даты и т. д., без сводки.
Если есть и другие папки, максимум, получите ваши версии-папки с dir ... "%basedir%\??.?.*"
("Два символа, точка, один символ, точка, что угодно")
Код, аналогичный тому, который выложил aschipfl. Одинаковый подход к заполнению значений для каждого сегмента, просто различная обработка разбиения имен и заполнения значений.
@echo off
setlocal enableextensions disabledelayedexpansion
rem Give a path as argument or use current active directory
for %%a in ("%~f1.") do set "target=%%~fa"
rem Prepare variables to handle phase order correction and
rem storage of intermediate/final values
set /a "_d=0", "_a=1", "_b=2", "_f=3"
set "lastValue="
set "lastVersion="
rem %%a : Search the folders and split their name using dot as delimiter
rem %%a = major
rem %%b = minor
rem %%c = update + phase + build
rem %%d : split %%c using [dabf] as delimters to obtain
rem %%d = update
rem %%e = build
rem %%f : split %%c using numbers as delimiters to obtain
rem %%f = phase
set "num=[0-9][0-9]*"
for /f "tokens=1-3 delims=." %%a in ('
dir /b /ad /o-d "%target%"
^| findstr /r /i /x /c:"%num%\.%num%\.%num%[dabf]%num%"
') do for /f "tokens=1,2 delims=dDaAbBfF" %%d in ( "%%c"
) do for /f "delims=0123456789" %%f in ( "%%c"
) do (
rem Folder name has been splitted. Now, convert each of the segments
rem to a numerical value, adding 1E6 to get a proper padding as all
rem values will be handled as strings to avoid limits in batch
rem arithmetic for values over 2^31
rem Note that %%f is not being iterated here as the values to use
rem for phase padding have been previously defined
for %%v in (
%%a %%b %%d %%e
) do if not defined _%%v set /a "_%%v=1000000 + %%v"
rem Obtain the properly padded version of the folder segments
setlocal enabledelayedexpansion
for /f "tokens=1,2" %%i in (
"!_%%a!!_%%b!!_%%d!!_%%f!!_%%e! !lastValue!"
) do (
endlocal
rem Determine if we have found a newer version
if "%%i" gtr "%%j" (
set "lastValue=%%i"
set "lastVersion=%%a.%%b.%%c"
)
)
)
if defined lastVersion (
echo Latest version found is : %lastVersion%
) else (
echo No matching folders
)