我正在寻找一个批处理文件脚本,它可以从版本字符串列表中获取以前的可用版本。
示例: 版本列表:“16.5.0.0,16.5.1.0,16.5.2.0,16.6.0.0,17.2.0.0” 当前版本:“16.5.1.4”
上面是可用值,现在我想要一个bat文件逻辑从列表中获取以前的可用版本,如下
先前可用版本:“16.5.1.0”
感谢您的回答。
更多示例 “16.5.0.0,16.5.1.0,16.5.2.0,16.6.0.0,17.2.0.0”
如果安装版本为“16.5.0.1”,那么我预计以前的版本为 16.5.0.0 如果“16.6.1.1”是安装版本,那么我预计以前的版本是 16.6.0.0
这是我想到的一些想法.. 我们可以有一些逻辑来循环和递减当前版本并与该列表进行比较,匹配结果应该就是答案。
非常感谢
下面的批处理文件在以下条件下产生预期结果:
16.5.0.0,17.2.0.0,16.5.1.0,16.6.0.0,16.5.2.0
。16.5.020.08
这样带有前导零的数字。 Windows 命令处理器 将带有前导 0
的数字解释为八进制数字。因此,020
被解释为十进制数 16
,08
被解释为十进制数 0
,因为数字 8
和 9
在八进制数中无效,在此错误情况下使用零。判断之前版本的批处理文件为:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "ListOfVersions=16.5.0.0,16.5.1.0,16.5.2.0,16.6.0.0,17.2.0.0"
set "PrevMajor=0" & set "PrevMinor=0" & set "PrevPatch=0" & set "PrevBuild=0"
if not "%~1" == "" (set "CurrentVersion=%~1") else set "CurrentVersion=16.5.1.4"
for /F "tokens=1-4 delims=." %%G in ("%CurrentVersion%") do set "CurrentMajor=%%G" & set "CurrentMinor=%%H" & set "CurrentPatch=%%I" & set "CurrentBuild=%%J"
for %%# in (%ListofVersions%) do for /F "tokens=1-4 delims=." %%G in ("%%#") do (
if %%G GTR !CurrentMajor! goto Output
if %%G LSS !CurrentMajor! (
set "PrevMajor=%%G" & set "PrevMinor=%%H" & set "PrevPatch=%%I" & set "PrevBuild=%%J"
) else (
if %%H GTR !CurrentMinor! goto Output
if %%H LSS !CurrentMinor! (
set "PrevMajor=%%G" & set "PrevMinor=%%H" & set "PrevPatch=%%I" & set "PrevBuild=%%J"
) else (
if %%I GTR !CurrentPatch! goto Output
if %%I LSS !CurrentPatch! (
set "PrevMajor=%%G" & set "PrevMinor=%%H" & set "PrevPatch=%%I" & set "PrevBuild=%%J"
) else (
if %%J GTR !CurrentBuild! goto Output
if %%J EQU !CurrentBuild! goto Output
set "PrevMajor=%%G" & set "PrevMinor=%%H" & set "PrevPatch=%%I" & set "PrevBuild=%%J"
)
)
)
)
:Output
echo Current version: %CurrentVersion%
echo Previous version: %PrevMajor%.%PrevMinor%.%PrevPatch%.%PrevBuild%
endlocal
可以从命令提示符窗口中运行批处理文件,并使用版本字符串作为第一个参数,以便轻松测试它,而无需更改批处理文件中的任何行。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
call /?
...解释%~1
echo /?
endlocal /?
for /?
goto /?
if /?
set /?
setlocal /?
另请参阅:
&
。