Làm thế nào tôi có thể so sánh các phiên bản của hai thực thi từ dòng lệnh?


13

Tôi có hai tệp thực thi (file1.exe và file2.exe).

Cả hai đều là tệp "giống nhau", nhưng một là phiên bản mới hơn từ nhà cung cấp so với tệp kia. Khi tôi mở các thuộc tính cho một trong số chúng, tôi nhận được các mục sau trong tab Chi tiết:

nhập mô tả hình ảnh ở đây

Theo đợt, tôi muốn so sánh hai phiên bản tệp và làm một cái gì đó nếu các phiên bản khác nhau ("nếu điều này, thì đó" loại kịch bản).

Tôi đã tìm kiếm cao và thấp, nhưng dường như tôi không thể tìm thấy một phương pháp xem thuộc tính "Phiên bản tệp" theo lô. Có bất kỳ phương tiện để thực hiện điều này?

Xin lưu ý rằng đây không phải là một câu hỏi "viết kịch bản cho tôi". Mục đích là để có một cái nhìn tổng quan hoặc mô tả chung hơn về câu trả lời, tại thời điểm đó, các chi tiết sẽ có thể đến dễ dàng hơn nhiều.

Câu trả lời:


27

Sigcheck - Sysiternals Suite

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

- nếu cần thêm MD5, SHA1, PESHA1, SHA256

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

- phiên bản thử nghiệm và chạy lệnh:

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

filever - Công cụ hỗ trợ:

Windows XP Service Pack 2 Công cụ hỗ trợ hoặc

Windows Server 2003 Gói dịch vụ 2 Công cụ hỗ trợ 32 bit

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"
    

vũ trụ:

wmic datafile where "name='C:\\<windows dir>\\system32\\mstsc.exe'" get version

Quyền hạn:

Mô tả tập tin:

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

phiên bản:

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

phiên bản kịch bản so sánh:

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

đầu ra:

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

trăn, pefile :

cài đặt modyle pefile: Giải nén, chạy 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:

Cài đặt Win32 :: File :: Module ModuleInfo: cpan Win32::File::VersionInfo

use Win32::File::VersionInfo;

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

1
Hãy thử và giữ các chỉnh sửa thực chất và giảm bớt cứ sau 10 phút
ngẫu nhiên

4
@random Than ôi. Nó cố gắng để cải thiện những gì đang có. Cảm ơn bạn đã bình luận, tôi sẽ cố gắng tạo ra những thay đổi lớn.
STTR

2

Câu trả lời của @STTR là tốt, ngoại trừ việc nó không cung cấp cách so sánh cụ thể các phiên bản theo đợt , vì đây cũng có thể là vấn đề, ví dụ, khi so sánh 10.0.10049 với 6.3.9600.

Nếu bạn làm điều đó với đơn giản IF %ver1% GTR %ver%, bạn sẽ có được so sánh chuỗi6.3.9600sẽ xuất hiện lớn hơn 10.0.10049.

Tôi biết bạn đã nói rằng nó không "viết cho tôi", nhưng đây là trường hợp khi viết mã dễ hơn giải thích bằng tiếng Anh đơn giản (và mã là tự giải thích).

Từ /superuser//a/363308/131936 Tôi đã tìm thấy cách đọc phiên bản tệp bằng cách sử dụng wmicvới các cửa sổ trần.

so sánhVersion.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
)

Làm thế nào để sử dụng điều này liên quan đến bạn câu hỏi của bạn:

đầu tiên, đọc một phiên bản tệp:

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

sau đó so sánh nó với (các) tệp khác:

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

Ngoài ra, bạn có thể phiên bản mã hóa cứng, nếu bạn muốn:

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

PS Đây là kịch bản của tôi để đọc / kiểm tra phiên bản windows , được xây dựng trên nguyên tắc tương tự.


1

Không chính xác để kiểm tra phiên bản, nhưng bạn có thể tính toán và so sánh tổng kiểm MD5 hoặc SHA1 của hai tệp và sau đó so sánh nếu chúng giống nhau. Nếu các chuỗi tổng kiểm tra bằng nhau, hai tệp hoàn toàn giống nhau (do đó là cùng một phiên bản), khác với nhau.

Bạn có thể sử dụng công cụ FCIV trong dòng lệnh để tính toán tổng kiểm tra.


1
Tôi không tin đó là những gì OP có sau ... Tôi nghĩ rằng chúng nằm sau phiên bản tệp, như được báo cáo bởi Windows
Canada Luke
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.