比较批处理文件中的版本号

Ada*_*nik 3 batch-file

我使用以下来获取文件的文件版本:

sigcheck.exe -n "C:\some.exe"
Run Code Online (Sandbox Code Playgroud)

以上返回类似于:12,2,0,6837.

我该如何获取此版本号.删除,以使1为一个大号,然后将其与另一个版本号进行比较,该版本号存储在txt文件的名称中,例如:12.3.0.7218.txt(即对存储在文件中的文件版本执行类似操作name:删除.来制作一个大数字).

如果包含其名称中的版本的文件晚于应用程序文件版本(即安装更新),我需要能够在批处理文件中执行一些代码.

dbe*_*ham 12

您不能简单地删除逗号(节点分隔符)并比较单个数字 - 它可能无法给出正确的结果.

例如,12.3和1.23都会导致123,导致等价的错误结论.您必须从左侧开始一次比较一个节点.一旦您发现节点的差异,那么您就得到了答案.如果节点是等效的,直到一个版本用完节点,则具有更多节点的版本更大:1.2.2> 1.2

编辑
有时公司将字母后缀添加到节点.这封信应被视为一个新节点.搜索和替换可用于在每个字母之前引入节点分隔符.搜索和替换不区分大小写,所以a等于A.

@echo off
setlocal
call :testVersions  2.1      1.9
call :testVersions "2,1"     1-9
call :testVersions  1.9      2.1
call :testVersions  1.13     1.4
call :testVersions  1.4      1.13
call :testVersions  1.3.4    1.3.4
call :testVersions  1.3.4    1.3.5
call :testVersions  1.3.5    1.3.4
call :testVersions  1.3.5    1.3.5.1
call :testVersions  1.3.5.1  1.3.5
call :testVersions  1.3b     1.3
call :testVersions  1.3      1.3b
call :testVersions  1.10a    1.9
call :testVersions  1.9      1.10a
call :testVersions  1.9a     1.9b
call :testVersions  1.9b     1.9a
call :testVersions  1.9a     1.9A
exit /b


:testVersions  version1  version2
call :compareVersions %1 %2
if %errorlevel% == 1 set "result=greater than"
if %errorlevel% == -1 set "result=less than"
if %errorlevel% == 0 set "result=equal to"
echo %~1 is %result% %~2
exit /b


:compareVersions  version1  version2
::
:: Compares two version numbers and returns the result in the ERRORLEVEL
::
:: Returns 1 if version1 > version2
::         0 if version1 = version2
::        -1 if version1 < version2
::
:: The nodes must be delimited by . or , or -
::
:: Nodes are normally strictly numeric, without a 0 prefix. A letter suffix
:: is treated as a separate node
::
setlocal enableDelayedExpansion
set "v1=%~1"
set "v2=%~2"
call :divideLetters v1
call :divideLetters v2
:loop
call :parseNode "%v1%" n1 v1
call :parseNode "%v2%" n2 v2
if %n1% gtr %n2% exit /b 1
if %n1% lss %n2% exit /b -1
if not defined v1 if not defined v2 exit /b 0
if not defined v1 exit /b -1
if not defined v2 exit /b 1
goto :loop


:parseNode  version  nodeVar  remainderVar
for /f "tokens=1* delims=.,-" %%A in ("%~1") do (
  set "%~2=%%A"
  set "%~3=%%B"
)
exit /b


:divideLetters  versionVar
for %%C in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set "%~1=!%~1:%%C=.%%C!"
exit /b
Run Code Online (Sandbox Code Playgroud)

--OUTPUT--

2.1 is greater than 1.9
2,1 is greater than 1-9
1.9 is less than 2.1
1.13 is greater than 1.4
1.4 is less than 1.13
1.3.4 is equal to 1.3.4
1.3.4 is less than 1.3.5
1.3.5 is greater than 1.3.4
1.3.5 is less than 1.3.5.1
1.3.5.1 is greater than 1.3.5
1.3b is greater than 1.3
1.3 is less than 1.3b
1.10a is greater than 1.9
1.9 is less than 1.10a
1.9a is less than 1.9b
1.9b is greater than 1.9a
1.9a is equal to 1.9A
Run Code Online (Sandbox Code Playgroud)