@ECHO OFF :: Check command line arguments IF "%~2"=="" GOTO Syntax IF NOT "%~3"=="" GOTO Syntax ECHO.%*| FINDSTR /R /X /C:"[0-9][0-9\.]*[0-9] *[0-9][0-9\.]*[0-9]" >NUL || GOTO Syntax SETLOCAL ENABLEDELAYEDEXPANSION :: Initialize variables SET Compare=0 SET Ver1=%~1 SET Ver2=%~2 :: Display debugging info IF "%DEBUG%"=="1" SET Ver :: Number of digits per version string SET Digits1=0 SET Digits2=0 FOR %%A IN (%Ver1:.= %) DO SET /A Digits1 += 1 FOR %%A IN (%Ver2:.= %) DO SET /A Digits2 += 1 :: Determine lowest and highest number of digits IF %Digits2% GTR %Digits1% (SET /A MaxDigits=%Digits2%) ELSE (SET /A MaxDigits=%Digits1%) IF %Digits2% GTR %Digits1% (SET /A MinDigits=%Digits1%) ELSE (SET /A MinDigits=%Digits2%) :: Retrieve individual digits for version string 1 CALL :StoreDigitsInArray DigitValue1 %Ver1:.= % FOR /F %%A IN ('SET DigitValue1 ^| FIND /C "DigitValue1."') DO SET Digits1=%%A :: Retrieve individual digits for version string 2 CALL :StoreDigitsInArray DigitValue2 %Ver2:.= % FOR /F %%A IN ('SET DigitValue2 ^| FIND /C "DigitValue2."') DO SET Digits2=%%A :: Display debugging info IF "%DEBUG%"=="1" SET Digits IF "%DEBUG%"=="1" SET MaxDigits IF "%DEBUG%"=="1" SET MinDigits :: Compare digits, break on first difference FOR /L %%A IN (1,1,%MinDigits%) DO ( IF !Compare! EQU 0 ( IF !DigitValue1.%%A! GTR !DigitValue2.%%A! SET Compare=2 IF !DigitValue1.%%A! LSS !DigitValue2.%%A! SET Compare=-2 ) ) :: If inconclusive, check the last digits of the longest version string SET /A MinDigits+=1 FOR /L %%A IN (!MinDigits!,1,%MaxDigits%) DO ( IF !Compare! EQU 0 ( IF "!DigitValue2.%%A!"=="" IF NOT "!DigitValue1.%%A!"=="0" SET Compare=1 IF "!DigitValue1.%%A!"=="" IF NOT "!DigitValue2.%%A!"=="0" SET Compare=-1 ) ) :: Display debugging info IF "%DEBUG%"=="1" ECHO CompareVersions=%Compare% :: Return result and quit ENDLOCAL & SET CompareVersions=%Compare% GOTO:EOF :StoreDigitsInArray :: %1 is the NAME of the array variable that will contain the individual digits in %2 .. %9 :: Leading zeroes must be removed to prevent the digits from being interpreted as OCTAL numbers. :: E.g. 3.0.070 would otherwise be interpreted as 3.0.56 in the versions comparison, :: by removing leading zeroes 3.0.070 will be interpreted as 3.0.70 instead; :: 3.0.080 would make the batch file fail because 080 is in INVALID octal number, :: by removing leading zeroes it will be correctly interpreted as 3.0.80. :: :: Digit 1 IF "%~1"=="" GOTO:EOF SET %~1.1=%2 CALL :RemoveLeadingZeroes %~1.1 :: Digit 2 IF "%~2"=="" GOTO:EOF SET %~1.2=%3 CALL :RemoveLeadingZeroes %~1.2 :: Digit 3 IF "%~3"=="" GOTO:EOF SET %~1.3=%4 CALL :RemoveLeadingZeroes %~1.3 :: Digit 4 IF "%~4"=="" GOTO:EOF SET %~1.4=%5 CALL :RemoveLeadingZeroes %~1.4 :: Digit 5 IF "%~5"=="" GOTO:EOF SET %~1.5=%6 CALL :RemoveLeadingZeroes %~1.5 :: Digit 6 IF "%~6"=="" GOTO:EOF SET %~1.6=%7 CALL :RemoveLeadingZeroes %~1.6 :: Digit 7 IF "%~7"=="" GOTO:EOF SET %~1.7=%8 CALL :RemoveLeadingZeroes %~1.7 :: Digit 8 IF "%~8"=="" GOTO:EOF SET %~1.8=%9 CALL :RemoveLeadingZeroes %~1.8 GOTO:EOF :RemoveLeadingZeroes :: %1 is the NAME of the variable whose VALUE should be stripped of leading zeroes SET Value=!%1! :Loop IF "%Value%"=="0" ( SET Value= GOTO:EOF ) IF "%Value:~0,1%"=="0" ( SET /A Value=%Value:~1% SET %1=%Value% ) ELSE ( SET Value= GOTO:EOF ) GOTO:Loop :Syntax ECHO CompareVersions.bat, Version 1.02 ECHO Compare 2 version strings ECHO. ECHO Usage: COMPAREVERSIONS version1 version2 ECHO. ECHO Notes: Versions must contain up to eight numerical digits only, ECHO separated by dots, e.g. 12.0.1650.1 ECHO The result is returned in environment variable %%CompareVersions%%. ECHO A positive return value means version1 is higher than version2, ECHO a negative value means version1 is lower than version2, ECHO zero means the versions are equal. ECHO If the absolute value of the result equals 2, only the number ECHO of digits from the shortest version were compared; ECHO if the absolute value equals 1, a number of zeroes had to be ECHO applied to the shortest version to make the comparison conclusive. ECHO. ECHO Examples: CompareVersions 10.2.0 10.1.1900 ^(returns 2^) ECHO CompareVersions 10.1.0.1900 10.1 ^(returns 1^) ECHO CompareVersions 10.00.0.0.0 10.0 ^(returns 0^) ECHO CompareVersions 10.0 10.0.0.1850 ^(returns -1^) ECHO CompareVersions 9.9.99.9999 10.1 ^(returns -2^) ECHO. ECHO Written by Rob van der Woude ECHO http://www.robvanderwoude.com EXIT /B 1