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

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

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

введите описание изображения здесь

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

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

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

13 голосов | спросил Moses 20 MaramFri, 20 Mar 2015 08:28:25 +03002015-03-20T08:28:25+03:0008 2015, 08:28:25

2 ответа


28

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 Service Pack 2 Инструменты поддержки или

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

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
    

    Версия:

    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 install: Unzip, запустите 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 20 MaramFri, 20 Mar 2015 09:54:24 +03002015-03-20T09:54:24+03:0009 2015, 09:54:24
    2

    @STTR 'отлично, за исключением того, что он не предоставляет способ сравнения версий в пакетном , так как это может быть проблемой, например, при сравнении 10.0.10049 с 6.3. 9600.

    Если вы сделаете это с помощью обычного IF %ver1% GTR %ver%, вы получите сравнение строк и ---- +: = 1 =: + ---- будет больше, чем 6.3.9600.

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

    От https://superuser.com/a/363308/131936 Я нашел, как читать версию файла используя 10.0.10049, который поставляется с голыми окнами.

    compareVersion.cmd

    wmic

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

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

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

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

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

    P.S. Вот мой скрипт для чтения /проверки версий Windows , построенный по аналогичному принципу.

    ответил LogicDaemon 22 AMpWed, 22 Apr 2015 10:16:23 +030016Wednesday 2015, 10:16:23

    Похожие вопросы

    Популярные теги

    security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132