Comment puis-je comparer les versions de deux exécutables à partir de la ligne de commande?

J'ai deux exécutables (fichier1.exe et fichier2.exe).

Les deux sont le "même" fichier, mais l'une est une version plus récente du fournisseur que l'autre. Lorsque j'ouvre les propriétés pour l'une d'elles, j'obtiens ce qui suit sous l'onglet Détails:

Entrez la description de l'image ici

Dans le lot, je voudrais comparer les deux versions de fichier et faire quelque chose si les versions sont différentes ("si ceci, puis ce" type de scénario).

J'ai cherché haut et bas, mais je ne peux pas trouver une méthode pour regarder l'attribut "Version de fichier" dans le lot. Y a-t-il un moyen d'accomplir cela?

Notez qu'il ne s'agit pas d'une question «Écrivez-moi un script pour moi». L'intention est d'avoir un aperçu plus général ou une description de la réponse, auquel cas les détails devraient pouvoir être plus facilement.

Sigcheck – Sysinternals Suite

sigcheck -a -q %windir%\system32\mstsc.exe 

– si besoin, ajoutez MD5, SHA1, PESHA1, SHA256

  sigcheck -a -q -h %windir%\system32\mstsc.exe 

– version de test, et exécutez la commande:

  sigcheck -a -q %windir%\system32\mstsc.exe | find "Prod version:" | find "6.0.6001.18564" && Echo "RDP 6.0.6001.18564" 

Filever – Outils de support:

Outils de support de Windows XP Service Pack 2 ou

Windows Server 2003 Service Pack 2 Outils de support 32 bits

 filever /V %windir%\system32\mstsc.exe 

Var 2:

  •  filever /V %windir%\system32\mstsc.exe | findstr "FileDesc Version" 
  •  filever /V %windir%\system32\mstsc.exe | findstr "ProductVersion" | find "6.0.6001.18564" && Echo "RDP 6.0.6001.18564" 
  •  filever /V %windir%\system32\mstsc.exe | findstr "ProductVersion" | find "6.0.6001.18564" || Echo "NOT 6.0.6001.18564" 

Wmic:

 wmic datafile where "name='C:\\<windows dir>\\system32\\mstsc.exe'" get version 

Powershell:

Description du fichier:

 powershell (gi %windir%\system32\mstsc.exe).versioninfo.FileDescription 

version:

 powershell (gi %windir%\system32\mstsc.exe).versioninfo ^|Ft -Au 

Version du script compare:

 $VerArr = [version]"8.2.6001.18564", [version]"6.0.6001.18564" [version]$v1="8.2.6001.18564" [version]$v2="6.0.6001.18564" [version]$v3=(gi $env:windir\system32\mstsc.exe).versioninfo.ProductVersion $v3 $v3 -ge $v1 $v3 -ge $v2 If ($VerArr -contains $v3) { echo 'Run version list block' } 

sortie:

 Major Minor Build Revision ----- ----- ----- -------- 6 0 6001 18564 False True Run version list block 

WSH:

 cscript //Nologo vers01.vbs 

Vers01.vbs:

 WScript.Echo CreateObject("Scripting.FileSystemObject").GetFileVersion(CreateObject("WScript.Shell").Environment("Process")("WINDIR") & "\system32\mstsc.exe") 

JScript:

 cscript //Nologo vers01.js 

Vers01.js:

 WScript.Echo(new ActiveXObject("Scripting.FileSystemObject").GetFileVersion(new ActiveXObject("WScript.Shell").ExpandEnvironmentStrings("%windir%")+"//system32//mstsc.exe")); 

Python, pefile :

Pefile modyle install: Décompressez, exécutez python setup.py install

 import pefile, os pe = pefile.PE(os.path.join(os.environ['WINDIR'],'system32\mstsc.exe')) ProductVersion = pe.FileInfo[0].StringTable[0].entries['ProductVersion'] print ProductVersion 

PHP:

 php vers01.php 

Php.ini ( %windir% ):

 extension_dir = C:\php\ext\ [COM_DOT_NET] extension=php_com_dotnet.dll 

Vers01.php:

 <?php $path = getenv('SystemRoot').'\\system32\\mstsc.exe'; $fso = new COM("Scripting.FileSystemObject"); echo $fso->GetFileVersion($path); ?> 

Perl:

Installer le module Win32 :: File :: VersionInfo: cpan Win32::File::VersionInfo

 use Win32::File::VersionInfo; $fn=$ENV{windir} . "\\system32\\mstsc.exe"; $fl=GetFileVersionInfo($fn); if($fl){print $fl->{FileVersion},"\n";} 

La réponse de @STTR est bonne, sauf qu'elle ne fournit pas un moyen de comparer les versions en lot , car cela peut aussi être le problème, par exemple, lors de la comparaison de 10.0.10049 avec 6.3.9600.

Si vous le faites avec simple IF %ver1% GTR %ver% , vous obtiendrez une comparaison de chaîne , et 6.3.9600 apparaîtront plus grand que 10.0.10049 .

Je sais que vous avez dit que ce n'est pas «écrire pour moi», mais il est plus facile d'écrire du code que d'expliquer en anglais clair (et le code s'explique par lui-même).

À partir de https://superuser.com/a/363308/131936, j'ai trouvé comment lire la version du fichier en utilisant wmic , qui est livré avec des fenêtres nues.

CompareVersion.cmd

 ( SETLOCAL ECHO Usage: %0 <file> [<MinVer>] ECHO If second argument provided, returns error level 1 if version of file is less than required ECHO Otherwise, sets %%filever%% variable to file version No. rem https://superuser.com/a/363308/131936 SET "fileNameForWMIC=%~1" ) SET fileNameForWMIC=%fileNameForWMIC:\=\\% FOR /F "usebackq skip=1" %%I IN (`wmic datafile where Name^="%fileNameForWMIC%" get Version`) DO ( SET filever=%%~I GOTO :break ) :break ( IF "%~2"=="" ( ENDLOCAL SET "filever=%filever%" EXIT /B ) FOR /F "delims=. tokens=1,2,3,4" %%I IN ("%filever%") DO ( SET fileverSub1=%%I SET fileverSub2=%%J SET fileverSub3=%%K SET fileverSub4=%%L ) FOR /F "delims=. tokens=1,2,3,4" %%I IN ("%~2") DO ( SET chkSub1=%%I SET chkSub2=%%J SET chkSub3=%%K SET chkSub4=%%L ) IF NOT DEFINED fileverSub2 SET fileverSub2=0 IF NOT DEFINED fileverSub3 SET fileverSub3=0 IF NOT DEFINED fileverSub4 SET fileverSub4=0 IF NOT DEFINED chkSub2 SET chkSub2=0 IF NOT DEFINED chkSub3 SET chkSub3=0 IF NOT DEFINED chkSub4 SET chkSub4=0 ) ( ENDLOCAL IF %chkSub1% GTR %fileverSub1% EXIT /B 1 IF %chkSub2% GTR %fileverSub2% EXIT /B 1 IF %chkSub3% GTR %fileverSub3% EXIT /B 1 IF %chkSub4% GTR %fileverSub4% EXIT /B 1 EXIT /B 0 ) 

Comment utiliser ceci en ce qui concerne votre question:

D'abord, lire une version de fichier:

 CALL compareVersion.cmd file1.exe SET file1ver=%filever% 

Puis comparez-le avec d'autres fichiers:

 CALL compareVersion.cmd file2.exe %file1ver% IF ERRORLEVEL 1 ( … do this when file2 is lower version than file1… ) ELSE ( … do this when file2 is higher or equal to version of file1… ) 

De plus, vous pouvez la version de code dur, si vous voulez:

 CALL compareVersion.cmd file2.exe 1.2.3.4 || (ECHO Min required version 1.2.3.4 not provided & EXIT /B) 

PS Voici mon script pour lire / vérifier la version des fenêtres , construit selon un principe similaire.

Pas exactement pour la vérification de la version, mais vous pouvez calculer et comparer la somme de contrôle MD5 ou SHA1 de deux fichiers, puis comparer si elles sont identiques. Si les chaînes de somme de contrôle sont égales, les deux fichiers sont exactement les mêmes (d'où la même version), sinon différent.

Vous pouvez utiliser l'outil FCIV en ligne de commande pour calculer la somme de contrôle.