如何使用批处理文件获取下一个最近的版本 |软件版本控制

问题描述 投票:0回答:1

我正在寻找一个批处理文件脚本,它可以从版本字符串列表中获取以前的可用版本。

示例: 版本列表:“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

这是我想到的一些想法.. 我们可以有一些逻辑来循环和递减当前版本并与该列表进行比较,匹配结果应该就是答案。

非常感谢

batch-file number-formatting semantic-versioning
1个回答
0
投票

下面的批处理文件在以下条件下产生预期结果:

  1. 当前版本字符串和版本列表中的任何版本字符串都不应包含与点和数字 0-9 不同的字符。
  2. 版本列表已按正确顺序排列。版本列表上的结果是错误的,类似于
    16.5.0.0,17.2.0.0,16.5.1.0,16.6.0.0,16.5.2.0
  3. 列表中的版本由普通空格、逗号、分号、等号或 OEM 编码的不间断空格(十进制代码点值为 255)分隔。
  4. 没有任何版本包含像
    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 /?

另请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.