Bagaimana saya bisa membandingkan versi dua executable dari baris perintah?

13

Saya memiliki dua file executable (file1.exe dan file2.exe).

Keduanya adalah file "sama", tetapi satu adalah versi yang lebih baru dari vendor daripada yang lain. Ketika saya membuka properti untuk salah satunya, saya mendapatkan yang berikut di bawah tab Detail:

masukkan deskripsi gambar di sini

Secara batch, saya ingin membandingkan dua versi file dan melakukan sesuatu jika versinya berbeda ("jika ini, maka itu" jenis skenario).

Saya telah mencari tinggi dan rendah, tetapi sepertinya saya tidak dapat menemukan metode untuk melihat atribut "Versi File" dalam batch. Apakah ada cara untuk mencapai ini?

Harap perhatikan bahwa ini tidak dimaksudkan sebagai pertanyaan "tuliskan skrip untuk saya". Maksudnya adalah untuk tinjauan umum atau deskripsi jawaban yang lebih umum, pada titik mana, perinciannya harus dapat dilakukan dengan lebih mudah.

Musa
sumber

Jawaban:

27

Sigcheck - Sysinternals Suite

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

- jika perlu tambahkan MD5, SHA1, PESHA1, SHA256

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

- versi uji, dan jalankan perintah:

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

filever - Alat pendukung:

Alat Dukungan Windows XP Paket Layanan 2 atau

Windows Server 2003 Paket Layanan 2 Alat Pendukung 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"
    

wmic:

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

Powershell:

Deskripsi berkas:

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

Versi: kapan:

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

bandingkan versi skrip:

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

keluaran:

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 :

instal pefile modyle: Unzip, jalankan 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:

Instal Win32 :: File :: module 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
sumber
1
Cobalah dan pertahankan pengeditan substantif dan berhentilah menabrak setiap 10 menit
acak
4
@random Alas. Ia berusaha memperbaiki apa yang ada. Terima kasih atas komentar Anda, saya akan mencoba membuat perubahan besar.
STTR
2

Jawaban @STTR baik-baik saja, kecuali tidak memberikan cara untuk membandingkan versi dalam batch , karena ini mungkin juga masalah, misalnya, ketika membandingkan 10.0.10049 dengan 6.3.9600.

Jika Anda melakukannya dengan polos IF %ver1% GTR %ver%, Anda akan mendapatkan perbandingan string , dan 6.3.9600akan tampak lebih besar dari 10.0.10049.

Saya tahu Anda telah mengatakan bahwa ini bukan "menulis untuk saya", tetapi ini adalah kasus ketika lebih mudah untuk menulis kode daripada menjelaskan dalam bahasa Inggris yang sederhana (dan kode itu cukup jelas).

Dari /superuser//a/363308/131936 Saya telah menemukan cara membaca versi file menggunakan wmic, yang dikirimkan dengan jendela kosong.

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
)

Cara menggunakan ini tentang pertanyaan Anda:

pertama, baca satu versi file:

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

lalu bandingkan dengan file lain:

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

Anda juga dapat versi hardcode, jika Anda ingin:

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

PS Berikut ini skrip saya untuk membaca / memeriksa versi windows , dibangun dengan prinsip yang sama.

LogicDaemon
sumber
1

Tidak persis untuk pemeriksaan versi, tetapi Anda dapat menghitung dan membandingkan checksum MD5 atau SHA1 dari dua file dan kemudian membandingkannya jika keduanya sama. Jika string checksum sama, kedua file persis sama (maka versi yang sama), yang lain berbeda.

Anda dapat menggunakan alat FCIV di baris perintah untuk menghitung checksum.

Chirag Bhatia - chirag64
sumber
1
Saya tidak percaya itulah yang diinginkan OP ... Saya pikir mereka mengejar versi file, seperti yang dilaporkan oleh Windows
Canadian Luke