Jak mogę porównać wersje dwóch plików wykonywalnych z wiersza poleceń?

13

Mam dwa pliki wykonywalne (file1.exe i file2.exe).

Oba są „tym samym” plikiem, ale jeden jest nowszą wersją od dostawcy niż drugi. Kiedy otwieram właściwości jednego z nich, w zakładce Szczegóły dostaję następujące informacje:

wprowadź opis zdjęcia tutaj

We wsadzie chciałbym porównać dwie wersje plików i zrobić coś, jeśli wersje są różne (scenariusz „jeśli to, to”).

Szukałem wysoko i nisko, ale nie mogę znaleźć sposobu, aby spojrzeć na atrybut „Wersja pliku” wsadowo. Czy jest jakiś sposób na osiągnięcie tego?

Pamiętaj, że nie jest to pytanie „napisz dla mnie skrypt”. Chodzi o bardziej ogólny przegląd lub opis odpowiedzi, w którym to momencie szczegóły powinny być łatwiejsze.

Mojżesz
źródło

Odpowiedzi:

27

Sigcheck - Sysinternals Suite

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

- w razie potrzeby dodać MD5, SHA1, PESHA1, SHA256

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

- wersja testowa i uruchom polecenie:

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

filever - Narzędzia wsparcia:

Narzędzia obsługi systemu Windows XP z dodatkiem Service Pack 2 lub

Windows Server 2003 Service Pack 2 32-bitowe narzędzia pomocy technicznej

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:

Opis pliku:

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

wersja:

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

porównanie wersji skryptu:

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

wynik:

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: Rozpakuj, uruchom 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:

Zainstaluj moduł 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
źródło
1
Staraj się, aby zmiany były wiarygodne i ułatwiać wpadanie co 10 minut
losowo
4
@ losowe Niestety. Stara się poprawić to, co jest. Dziękuję za komentarz, postaram się wprowadzić duże zmiany.
STTR
2

Odpowiedź @STTR jest w porządku, z wyjątkiem tego, że nie zapewnia sposobu na porównanie wersji wsadowych , ponieważ może to być również problem, na przykład przy porównywaniu 10.0.10049 z 6.3.9600.

Jeśli zrobisz to z prostym IF %ver1% GTR %ver%, otrzymasz porównanie ciągów i 6.3.9600będzie większe niż 10.0.10049.

Wiem, że powiedziałeś, że nie jest to „pisz dla mnie”, ale dzieje się tak, gdy łatwiej jest napisać kod niż wyjaśnić go zwykłym angielskim (a kod jest zrozumiały).

Od /superuser//a/363308/131936 dowiedziałem się, jak czytać wersję pliku za pomocą wmic, która jest dostarczana z pustymi oknami.

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
)

Jak wykorzystać to w odniesieniu do twojego pytania:

najpierw przeczytaj jedną wersję pliku:

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

następnie porównaj go z innymi plikami:

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

możesz też na stałe zapisać wersję, jeśli chcesz:

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

PS Oto mój skrypt do odczytu / sprawdzenia wersji systemu Windows , zbudowany na podobnej zasadzie.

LogicDaemon
źródło
1

Niezupełnie do sprawdzania wersji, ale można obliczyć i porównać sumę kontrolną MD5 lub SHA1 dwóch plików, a następnie porównać, jeśli są takie same. Jeśli ciągi sumy kontrolnej są równe, oba pliki są dokładnie takie same (stąd ta sama wersja), w przeciwnym razie różne.

Możesz użyć narzędzia FCIV w wierszu poleceń, aby obliczyć sumę kontrolną.

Chirag Bhatia - chirag64
źródło
1
Nie sądzę, że o to chodzi w OP ... Myślę, że są po wersji pliku, jak donosi Windows
Kanadyjczyk Luke