Come posso confrontare le versioni di due eseguibili dalla riga di comando?


13

Ho due eseguibili (file1.exe e file2.exe).

Entrambi sono lo "stesso" file, ma uno è una versione più recente del fornitore rispetto all'altro. Quando apro le proprietà per una di esse, ottengo quanto segue nella scheda Dettagli:

inserisci qui la descrizione dell'immagine

In batch, vorrei confrontare le due versioni del file e fare qualcosa se le versioni sono diverse ("se questo, quindi quel" tipo di scenario).

Ho cercato in alto e in basso, ma non riesco a trovare un metodo per esaminare l'attributo "Versione file" in batch. Esiste un modo per raggiungere questo obiettivo?

Nota che questa non è una domanda "scrivi una sceneggiatura per me". L'intento è quello di avere una panoramica o una descrizione più generale della risposta, a quel punto, i dettagli dovrebbero poter arrivare molto più facilmente.

Risposte:


27

Sigcheck - Suite Sysinternals

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

- se necessario aggiungere MD5, SHA1, PESHA1, SHA256

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

- testare la versione ed eseguire il comando:

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

filever - Strumenti di supporto:

Strumenti di supporto di Windows XP Service Pack 2 o

Strumenti di supporto a 32 bit per Windows Server 2003 Service Pack 2

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:

Descrizione del file:

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

versione:

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

confronto versione 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'
   }

produzione:

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"));

pitone, pefile :

pefile modyle install: decomprimere, eseguire 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:

Installa il modulo 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";}

1
Cerca di mantenere sostanziali le modifiche e alleggeriscilo ogni 10 minuti
casuale

4
@random Alas. Tenta di migliorare ciò che è. Grazie per il tuo commento, proverò a fare grandi cambiamenti.
STTR

2

La risposta di @STTR va bene, tranne per il fatto che non fornisce un modo per confrontare le versioni in batch , poiché questo potrebbe essere anche il problema, ad esempio, quando si confronta 10.0.10049 con 6.3.9600.

Se lo farai con plain IF %ver1% GTR %ver%, otterrai il confronto delle stringhe e 6.3.9600apparirà più grande di 10.0.10049.

So che hai detto che non è "scrivi per me", ma questo è il caso in cui è più facile scrivere codice che spiegare in un inglese semplice (e il codice è autoesplicativo).

Da /superuser//a/363308/131936 ho trovato come leggere la versione del file usando wmic, che viene spedito con windows nudo.

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
)

Come usare questo riguardo a te la tua domanda:

prima leggi una versione del file:

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

quindi confrontalo con altri file:

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…
)

inoltre, è possibile hardcode versione, se si desidera:

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

PS Ecco il mio script per leggere / controllare la versione di Windows , basata su un principio simile.


1

Non esattamente per il controllo della versione, ma è possibile calcolare e confrontare il checksum MD5 o SHA1 di due file e quindi confrontare se sono uguali. Se le stringhe di checksum sono uguali, i due file sono esattamente gli stessi (quindi la stessa versione), altrimenti diversi.

È possibile utilizzare lo strumento FCIV nella riga di comando per calcolare il checksum.


1
Non credo che sia dopo ciò che l'OP ... Penso che siano dopo la versione del file, come riportato da Windows
Luke canadese
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.