我有一个包含多个子目录的文件夹
版本格式为[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
答案 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%\??.?.*"
("两个字符,点,一个字符,点,等等")