Como posso comparar as versões de dois executáveis da linha de comando?

13

Eu tenho dois executáveis (file1.exe e file2.exe).

Ambos são o mesmo arquivo, mas um é uma versão mais recente do fornecedor do que o outro. Quando abro as propriedades de uma delas, obtenho o seguinte na guia Detalhes:

Emlote,gostariadecompararasduasversõesdearquivoefazeralgoseasversõesforemdiferentes("se isso, então esse" tipo de cenário).

Pesquisei alto e baixo, mas não consigo encontrar um método de ver o atributo "Versão do arquivo" em lote. Existe algum meio de realizar isso?

Por favor note que isto não pretende ser uma pergunta "escreva um script para mim". A intenção é uma visão geral mais geral ou uma descrição da resposta, quando os detalhes devem vir com muito mais facilidade.

    
por Moses 20.03.2015 / 06:28

3 respostas

28

Sigcheck - Sysinternals Suite

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

- se precisar adicionar MD5, SHA1, PESHA1, SHA256

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

- testa a versão e executa o comando:

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

filever - Ferramentas de suporte:

Ferramentas de suporte do Windows XP Service Pack 2 ou

Ferramentas de Suporte do Windows Server 2003 Service Pack 2 de 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:

FileDescription:

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

versão:

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

comparar a versão do 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'
   }

saída:

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 :

Modyle do pefile install: descompacte e execute 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:

Instale o módulo 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";}
    
por 20.03.2015 / 07:54
2

@STTR 'resposta está bem, exceto que não fornece uma maneira de comparar versões em lote , pois isso pode ser também o problema, por exemplo, ao comparar 10.0.10049 com 6.3. 9600.

Se você fizer isso com IF %ver1% GTR %ver% simples, obterá uma comparação de string , e 6.3.9600 aparecerá maior que 10.0.10049 .

Eu sei que você disse que não é "escreva para mim", mas este é o caso quando é mais fácil escrever código do que explicar em inglês simples (e o código é auto-explicativo).

De link descobri como ler a versão do arquivo usando wmic , que é fornecido com as janelas simples.

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
)

Como usar isso com relação à sua pergunta:

primeiro, leia uma versão do arquivo:

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

depois compare com outro (s) arquivo (s):

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

você também pode codificar a versão, se quiser:

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

P.S. Aqui está meu script para ler / verificar a versão do windows , criado em princípio similar.

    
por 22.04.2015 / 09:16
1

Não é exatamente para verificação de versão, mas é possível calcular e comparar a soma de verificação MD5 ou SHA1 de dois arquivos e comparar se eles são iguais. Se as sequências de soma de verificação forem iguais, os dois arquivos são exatamente iguais (portanto, a mesma versão), senão diferentes.

Você pode usar a ferramenta FCIV na linha de comando para calcular a soma de verificação.

    
por 20.03.2015 / 13:20