如何使用批处理获取最新版本号

时间:2016-08-03 04:28:24

标签: batch-file

我有一个包含多个子目录的文件夹

Directories example

版本格式为[major].[minor].[update][phase][build],与1.0.0d0类似。有效阶段是d(ev),a(lpha),b(eta),f(inal),请注意d< a< b< F。

我想使用批处理脚本获取最新版本号16.0.0a2。我写这样的代码,但不起作用,因为子目录按字母顺序排序。所以它会给出结果16.0.0d24。

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 个答案:

答案 0 :(得分:2)

以下脚本可以满足您的需求:

@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

基本概念是调整版本号,以便(alpha-)数字排序提供与字母排序相同的结果。这可以通过在版本号的每个数字部分添加一个很大的数字来实现,这样每个数字部分总是具有相同的数字位数。此外,由于相位图的优先级不是按字母顺序排列,因此可以进行适当的替换。

核心理念来自this answer,并归功于Aacini

答案 1 :(得分:1)

与aschipfl的posted类似的代码。每个段的相同值填充方法,只是对名称拆分和值填充的​​不同处理。

...\mkl\lib\intel64_win\mkl_rt.lib: error adding symbols: File format not recognized

答案 2 :(得分:1)

在这种情况下,创建日期应该是排序的好标准:

...
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%\??.?.*"("两个字符,点,一个字符,点,等等")