Wie kann ich die Versionen von zwei ausführbaren Dateien über die Befehlszeile vergleichen?

13

Ich habe zwei ausführbare Dateien (file1.exe und file2.exe).

Beide sind die "gleiche" Datei, aber eine ist eine neuere Version des Herstellers als die andere. Wenn ich die Eigenschaften für eine von ihnen öffne, wird auf der Registerkarte Details Folgendes angezeigt:

Bildbeschreibung hier eingeben

Im Batch möchte ich die beiden Dateiversionen vergleichen und etwas unternehmen, wenn die Versionen unterschiedlich sind ("if this, then that" -Szenario).

Ich habe hoch und niedrig gesucht, aber ich kann keine Methode finden, um das Attribut "Dateiversion" im Stapel zu betrachten. Gibt es irgendwelche Mittel, um dies zu erreichen?

Bitte beachten Sie, dass dies keine Frage zum Schreiben eines Skripts für mich ist. Die Absicht ist ein allgemeinerer Überblick oder eine Beschreibung der Antwort. An diesem Punkt sollten die Details viel einfacher zu verstehen sein.

Moses
quelle

Antworten:

27

Sigcheck - Sysinternals Suite

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

- Bei Bedarf MD5, SHA1, PESHA1, SHA256 hinzufügen

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

- Testversion und Befehl ausführen:

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

filever - Support-Tools:

Windows XP Service Pack 2-Supporttools oder

32-Bit-Supporttools für Windows Server 2003 Service Pack 2

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

Power Shell:

Dateibeschreibung:

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

Ausführung:

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

Skriptversion vergleichen:

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

Ausgabe:

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: Entpacken, ausführen 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:

Installieren Sie das Win32 :: File :: VersionInfo-Modul: cpan Win32::File::VersionInfo

use Win32::File::VersionInfo;

  $fn=$ENV{windir} . "\\system32\\mstsc.exe";
  $fl=GetFileVersionInfo($fn);
  if($fl){print $fl->{FileVersion},"\n";}
STTR
quelle
1
Versuchen Sie, die Änderungen inhaltlich beizubehalten, und sorgen Sie dafür, dass alle 10 Minuten weniger
zufällig
4
@ Random leider. Es versucht zu verbessern, was ist. Vielen Dank für Ihren Kommentar, ich werde versuchen, große Änderungen vorzunehmen.
STTR
2

Die Antwort von @STTR ist in Ordnung, bietet aber keine Möglichkeit, Versionen im Batch zu vergleichen , da dies beispielsweise auch das Problem beim Vergleich von 10.0.10049 mit 6.3.9600 sein kann.

Wenn Sie es mit plain machen IF %ver1% GTR %ver%, erhalten Sie einen Stringvergleich und 6.3.9600erscheinen größer als 10.0.10049.

Ich weiß, dass Sie gesagt haben, dass es nicht "für mich schreiben" ist, aber in diesem Fall ist es einfacher, Code zu schreiben, als ihn im Klartext zu erklären (und der Code ist selbsterklärend).

Unter /superuser//a/363308/131936 habe ich herausgefunden, wie man die Dateiversion liest wmic, die mit nackten Fenstern geliefert wird.

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
)

Wie Sie dies in Bezug auf Ihre Frage nutzen können:

Lesen Sie zuerst eine Dateiversion:

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

dann vergleiche es mit anderen Dateien:

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

Sie können die Version auch fest codieren, wenn Sie möchten:

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

PS Hier ist mein Skript zum Lesen / Überprüfen der Windows-Version , das auf einem ähnlichen Prinzip basiert .

LogicDaemon
quelle
1

Nicht genau für die Versionsprüfung, aber Sie können die MD5- oder SHA1-Prüfsumme zweier Dateien berechnen und vergleichen und dann vergleichen, ob sie identisch sind. Wenn die Prüfsummenzeichenfolgen gleich sind, sind die beiden Dateien identisch (daher dieselbe Version), ansonsten unterschiedlich.

Sie können das FCIV-Tool in der Befehlszeile verwenden, um die Prüfsumme zu berechnen.

Chirag Bhatia - chirag64
quelle
1
Ich glaube nicht , dass das , was die OP ist nach ... Ich denke , sie nach der Dateiversion sind, wie von Windows berichtet
Canadian Luke