Как получить номер последней версии с помощью пакета

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
    )
Другие вопросы по тегам