2013-04-04 182 views
1

比较的版本号,我使用下面的获取文件的文件版本:在批处理文件

sigcheck.exe -n "C:\some.exe" 

以上的回报是这样的:12,2,0,6837。

我该如何取这个版本号。删除,使1大号&然后将其与另一个版本号进行比较,该版本号存储在txt文件的名称中,例如:12.3.0.7218.txt(即,执行与存储在文件中的文件版本类似的内容名称:删除。的大数字)。

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

+0

如果逗号和点被删除,你可以比较两个数字?例如。 '如果%v1%lss%v2%...'¿ – Endoro 2013-04-04 09:53:46

+0

考虑,有些版本号就像'12.13.0.7218' :) – Endoro 2013-04-04 10:07:08

回答

0

到逗号[无]

set sig=12,2,0,6837 
set sig=%sig:,=% 
echo sig=%sig% 

获得的文件名给一个变量,假定颇多,喜欢这个名字是在目录中最新的转换 - - 不知道的细节,对不起 - 你必须更具体。

set "file=" 
for /f %%i in ('dir /b /a-d /o-d *.txt') do if not defined file set file=%%~ni 
set file=%file:~.=% 
echo %file% 

但是 - 全部取决于你如何建议检索文件名。


因此,如果您使用

:: you are manually entering NEWVER 
SET newver=1230718 


for /f %%i in (' sigcheck.exe -n "C:\some.exe" ') do set sig=%%i 
Echo As a check, sig retrieved was %sig% 

set sig=%sig:,=% 
echo Which gets transformed to sig=%sig% 

if %sig% lss %newver% (ECHO New version to be installed 
) else (echo do not install new version) 

现在,如果你想执行

thisbatch 1230718 

可以更换

SET newver=1230718 

SET "newver=%1" 

而且由于1230718是给予批处理过程thisbatchnewver将被设置为1230718

+0

好吧,谢谢你,让我们更简单。 如果我把第二个文件版本放在批处理文件中而不是读取它,如:1230718. 那么刚刚把第一个文件版本格式化然后比较 – 2013-04-04 10:05:09

0

删除逗号的第一个参数:

set "v1=12,2,0,6837" 
set "v1=%v1:,=%" 

删除点:

set "v2=12.3.0.7218" 
set "v2=%v2:.=%" 
8

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

例如,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 

--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 
+0

+1,谢谢,非常有用。我已经把它发布到其他论坛:) – Endoro 2013-04-04 22:38:31