2013-04-04 124 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