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

13

J'ai deux exécutables (file1.exe et file2.exe).

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

entrez la description de l'image ici

En lot, j'aimerais comparer les deux versions de fichier et faire quelque chose si les versions sont différentes ("si ceci, alors ce" type de scénario).

J'ai cherché haut et bas, mais je n'arrive pas à trouver une méthode pour regarder l'attribut "Version du fichier" en lot. Existe-t-il un moyen d'y parvenir?

Veuillez noter qu'il ne s'agit pas d'une question "écrivez un script pour moi". L'intention est d'avoir une vue d'ensemble ou une description plus générale de la réponse, auquel cas les détails devraient pouvoir venir beaucoup plus facilement.

Moïse
la source

Réponses:

27

Sigcheck - Suite Sysinternals

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

- si besoin ajouter MD5, SHA1, PESHA1, SHA256

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

- testez la version 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 d'assistance:

Outils de support de Windows XP Service Pack 2 ou

Outils de support de Windows Server 2003 Service Pack 2 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

comparer la version du script:

$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'
   }

production:

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 :

installation du style pefile: 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:

Installez 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";}
STTR
la source
1
Essayez de garder les modifications substantielles et simplifiez les bosses toutes les 10 minutes
hasard
4
@random Hélas. Il tente d'améliorer ce qui est. Merci pour ton commentaire, je vais essayer de faire de gros changements.
STTR
2

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

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

Je sais que vous avez dit que ce n'est pas "écrire pour moi", mais c'est le cas quand il est plus facile d'écrire du code que d'expliquer en anglais simple (et le code est explicite).

De /superuser//a/363308/131936 j'ai trouvé comment lire la version du fichier à l' aide 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 /superuser//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 concernant votre question:

lisez d'abord 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…
)

vous pouvez également coder en dur la version, si vous le souhaitez:

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 Windows , construit sur un principe similaire.

LogicDaemon
la source
1

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

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

Chirag Bhatia - chirag64
la source
1
Je ne crois pas que c'est ce que l'OP est après ... Je pense qu'ils sont après la version du fichier, tel que rapporté par Windows
Canadien Luke