(view source code of compareversions.bat as plain text)
@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
page last modified: 2023-03-10