İki yürütülebilir dosyanın sürümlerini komut satırından nasıl karşılaştırabilirim?


13

İki executables var (file1.exe ve file2.exe).

Her ikisi de "aynı" dosyadır, ancak biri satıcıdan diğerinden daha yeni bir sürümdür. Bunlardan birinin özelliklerini açtığımda, Ayrıntılar sekmesi altında aşağıdakileri alıyorum:

resim açıklamasını buraya girin

Toplu olarak, iki dosya sürümünü karşılaştırmak ve sürümleri farklıysa bir şey yapmak istiyorum ("eğer öyleyse, o" senaryo türü).

Yüksek ve düşük aradım, ancak toplu olarak "Dosya Sürümü" özniteliğine bakmak için bir yöntem bulamıyorum. Bunu başarmanın herhangi bir yolu var mı?

Bunun "benim için bir senaryo yazın" sorusu olmadığını lütfen unutmayın. Niyet, cevabın daha genel bir özeti veya açıklamasıdır, bu noktada detayların daha kolay gelebilmesi gerekir.

Yanıtlar:


27

Sigcheck - Sysinternals Süiti

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

- gerekirse MD5, SHA1, PESHA1, SHA256 ekleyin

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

- sürümü test et ve çalıştır komutu:

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

filever - Destek araçları:

Windows XP Service Pack 2 Destek Araçları veya

Windows Server 2003 Service Pack 2 32 bit Destek Araçları

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

Güç kalkanı:

FileDescription:

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

versiyon:

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

komut dosyası sürümü karşılaştırın:

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

çıktı:

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"));

piton, pefile :

pefile modyle install: Unzip, çalıştır 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 yükleyin :: Dosya :: VersionInfo modülü: cpan Win32::File::VersionInfo

use Win32::File::VersionInfo;

  $fn=$ENV{windir} . "\\system32\\mstsc.exe";
  $fl=GetFileVersionInfo($fn);
  if($fl){print $fl->{FileVersion},"\n";}

1
Düzenlemeleri önemli tutmaya çalışın ve her 10 dakikada bir çarpmayı kolaylaştırın
rastgele

4
@random Alas. Ne olduğunu geliştirmeye çalışır. Yorumunuz için teşekkür ederim, büyük değişiklikler yapmaya çalışacağım.
STTR

2

@STTR 'yanıtı iyidir, ancak sürümleri toplu olarak karşılaştırmanın bir yolunu sağlamaz , çünkü bu, örneğin 10.0.10049 ile 6.3.9600'ü karşılaştırırken de sorun olabilir.

Düz IF %ver1% GTR %ver%ile yaparsanız, dize karşılaştırması alırsınız ve 6.3.9600daha büyük görünür 10.0.10049.

"Benim için yaz" olmadığını söylediğini biliyorum, ama kod yazmak daha kolay İngilizce açıklamak daha kolay olduğunda (ve kod kendini açıklayıcı) budur.

Gönderen /superuser//a/363308/131936 Ben kullanarak dosya sürümü okumayı buldum wmicçıplak pencerelerle sevk edilir.

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
)

Sorunuz sizinle ilgili olarak nasıl kullanılır:

önce bir dosya sürümünü okuyun:

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

ardından diğer dosyalarla karşılaştırın:

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

ayrıca, isterseniz sabit kod sürümünü yapabilirsiniz:

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

PS İşte benzer prensibe dayanan windows sürümünü okumak / kontrol etmek için benim script .


1

Tam olarak sürüm kontrolü için değil, ancak iki dosyanın MD5 veya SHA1 sağlama toplamını hesaplayıp karşılaştırabilir ve sonra aynı olup olmadığını karşılaştırabilirsiniz. Sağlama toplamı dizeleri eşitse, iki dosya tam olarak aynıdır (dolayısıyla aynı sürüm), başka farklıdır.

Sen edebilirsiniz FCIV aracı kullanmak hesapla sağlama toplamına komut satırında.


1
OP'nin bundan sonra olduğuna inanmıyorum ... Sanırım Windows tarafından bildirildiği gibi dosya sürümünden
Kanadalı Luke
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.