Every current Windows version features the FILEVER command to read files' file and product version:
Prints file version information. filever [/S] [/V] [/E] [/X] [/B] [/A] [/D] [[drive:][path][filename]] /S Displays files in specified directory and all subdirectories. /V List verbose version information if available. /E List executables only. /X Displays short names generated for non-8dot3 file names. /B Uses bare format (no dir listing). /A Don't display file attributes. /D Don't display file date and time.
Its /V switch reveals lots of file details:
D:\>filever /v %windir%\system32\cacls.exe
--a-- W32i APP ENU 6.1.7600.16385 shp 25,600 07-14-2009 cacls.exe
Language 0x0409 (English (United States))
CharSet 0x04b0 Unicode
OleSelfRegister Disabled
CompanyName Microsoft Corporation
FileDescription Control ACLs Program
InternalName cacls
OriginalFilenam CACLS.EXE
ProductName Microsoft™ Windows™ Operating System
ProductVersion 6.1.7600.16385
FileVersion 6.1.7600.16385 (win7_rtm.090713-1255)
LegalCopyright © Microsoft Corporation. All rights reserved.
VS_FIXEDFILEINFO:
Signature: feef04bd
Struc Ver: 00010000
FileVer: 00060001:1db04001 (6.1:7600.16385)
ProdVer: 00060001:1db04001 (6.1:7600.16385)
FlagMask: 0000003f
Flags: 00000000
OS: 00040004 NT Win32
FileType: 00000001 App
SubType: 00000000
FileDate: 00000000:00000000
D:\>
To extract the product version we can use a FOR /F loop:
FOR /F "tokens=2" %%A IN ('FILEVER /V %windir%\System32\cacls.exe ^" FIND "ProductVersion"') DO SET ProductVersion=%%A
Note, however, that the term ProductVersion is language dependent, i.e. you have to adapt FIND's search string to the OS language.
If you cannot be sure about the OS language, your safest bet is to use the file version:
FOR /F "tokens=5" %%A IN ('FILEVER %windir%\system32\cacls.exe') DO SET FileVersion=%%A
Note that we did not use the /V switch, nor did we need FIND.
To compare two versions, we cannot just use IF version1 GTR version2 because that would only work on integers; if the versions compared contain dots, the IF statement performs a string comparison, making "9.10" greater than "10.9".
We have to compare the versions one digit at a time, until a difference is found.
I wrote CompareVersions.bat to perform a proper comparison, digit by digit.
It required quite a lot of code to accomplish this, mainly because leading zeroes may make an IF version1_digit_n GTR version2_digit_n test err or even crash.
page last modified: 2017-02-28; loaded in 0.0036 seconds