¿Cómo puedo comparar las versiones de dos ejecutables desde la línea de comandos?

13

Tengo dos ejecutables (file1.exe y file2.exe).

Ambos son el "mismo" archivo, pero uno es una versión más nueva del proveedor que el otro. Cuando abro las propiedades de uno de ellos, obtengo lo siguiente en la pestaña Detalles:

ingrese la descripción de la imagen aquí

En lote, me gustaría comparar las dos versiones de archivo y hacer algo si las versiones son diferentes ("si esto, entonces" tipo de escenario).

He buscado por todas partes, pero parece que no puedo encontrar un método para mirar el atributo "Versión del archivo" por lotes. ¿Hay alguna forma de lograr esto?

Tenga en cuenta que esto no pretende ser una pregunta de "escribir un guión para mí". La intención es una descripción general más general o una descripción de la respuesta, en cuyo punto, los detalles deberían poder ser mucho más fáciles.

Moisés
fuente

Respuestas:

27

Sigcheck - Suite Sysinternals

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

- si es necesario, agregue MD5, SHA1, PESHA1, SHA256

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

- Versión de prueba y comando de ejecución:

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

filever - Herramientas de soporte:

De Windows XP Service Pack 2 herramientas de soporte o

Windows Server 2003 Service Pack 2 Herramientas de soporte 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

Potencia Shell:

Descripción del archivo:

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

versión:

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

versión de script comparar:

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

salida:

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 :

instalación de pefile modyle: descomprimir, ejecutar 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 el 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";}
STTR
fuente
1
Intente y mantenga las ediciones sustantivas y reduzca los golpes cada 10 minutos
azar
44
@random Alas. Intenta mejorar lo que es. Gracias por tu comentario, intentaré hacer grandes cambios.
STTR
2

La respuesta de @STTR 'está bien, excepto que no proporciona una manera de comparar versiones en lotes , ya que este también puede ser el problema, por ejemplo, al comparar 10.0.10049 con 6.3.9600.

Si lo haces con plain IF %ver1% GTR %ver%, obtendrás una comparación de cadenas y 6.3.9600aparecerá más grande que 10.0.10049.

Sé que has dicho que no es "escribir para mí", pero este es el caso cuando es más fácil escribir código que explicarlo en inglés simple (y el código se explica por sí mismo).

En /superuser//a/363308/131936 he encontrado cómo leer la versión del archivo usando wmic, que se envía con ventanas desnudas.

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
)

Cómo usar esto con respecto a su pregunta:

Primero, lea una versión de archivo:

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

luego compárelo con otros archivos:

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

Además, puede codificar la versión, si lo desea:

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

PD: Aquí está mi script para leer / verificar la versión de Windows , construido en un principio similar.

LogicDaemon
fuente
1

No es exactamente para la verificación de versiones, pero puede calcular y comparar la suma de verificación MD5 o SHA1 de dos archivos y luego comparar si son iguales. Si las cadenas de suma de verificación son iguales, los dos archivos son exactamente iguales (de ahí la misma versión), de lo contrario son diferentes.

Puede usar la herramienta FCIV en la línea de comando para calcular la suma de verificación.

Chirag Bhatia - chirag64
fuente
1
No creo que eso sea lo que busca el OP ... Creo que buscan la versión del archivo, según lo informado por Windows
canadiense Luke el