मैं कमांड लाइन से दो निष्पादकों के संस्करणों की तुलना कैसे कर सकता हूं?


13

मेरे पास दो निष्पादनयोग्य (file1.exe और file2.exe) हैं।

दोनों "एक ही" फ़ाइल हैं, लेकिन एक विक्रेता से दूसरे की तुलना में एक नया संस्करण है। जब मैं उनमें से किसी एक के लिए गुणों को खोलता हूं, तो मुझे विवरण टैब के तहत निम्नलिखित मिलते हैं:

यहाँ छवि विवरण दर्ज करें

बैच में, मैं दो फ़ाइल संस्करणों की तुलना करना चाहता हूं और कुछ करना चाहिए यदि संस्करण अलग हैं ("यदि यह है, तो वह" प्रकार का परिदृश्य)।

मैंने उच्च और निम्न खोज की है, लेकिन मुझे बैच में "फ़ाइल संस्करण" विशेषता को देखने का एक तरीका नहीं मिल रहा है। क्या इसे पूरा करने का कोई साधन है?

कृपया ध्यान दें कि यह "मेरे लिए एक स्क्रिप्ट लिखने" प्रश्न होने का इरादा नहीं है। आशय अधिक सामान्य अवलोकन या उत्तर के विवरण के लिए है, जिस बिंदु पर, विवरण को अधिक आसानी से आने में सक्षम होना चाहिए।

जवाबों:


27

सिगचेक - सिसिन्टर्नल्स सुइट

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"

फ़ाइलर - समर्थन उपकरण:

Windows XP सर्विस पैक 2 समर्थन उपकरण या

Windows Server 2003 सर्विस पैक 2 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 (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"));

अजगर, पीफाइल :

pefile modyle install: अनज़िप, रन 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 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);
?>

पर्ल:

Win32 :: फ़ाइल :: VersionInfo मॉड्यूल स्थापित करें: cpan Win32::File::VersionInfo

use Win32::File::VersionInfo;

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

1
कोशिश करो और संपादन मूल रखने के लिए और हर 10 मिनट में जोड़ने से पर कम
यादृच्छिक

4
@ आयामी आल्हा। यह जो है उसे सुधारने का प्रयास करता है। आपकी टिप्पणी के लिए धन्यवाद, मैं बड़े बदलाव करने की कोशिश करूंगा।
STTR

2

@STTR का उत्तर ठीक है, सिवाय इसके कि यह बैच में संस्करणों की तुलना करने का एक तरीका प्रदान नहीं करता है , क्योंकि यह भी समस्या हो सकती है, उदाहरण के लिए, जब 10.0.10049 की 6.3.9600 के साथ तुलना की जाती है।

यदि आप इसे सादे के साथ करते हैं IF %ver1% GTR %ver%, तो आपको स्ट्रिंग तुलना6.3.9600 मिलेगी , और इससे बड़ी दिखाई देगी 10.0.10049

मुझे पता है कि आपने बताया है कि यह "मेरे लिए लिखें" नहीं है, लेकिन यह मामला है जब सादे अंग्रेजी में समझाने की तुलना में कोड लिखना आसान है (और कोड स्वयं-व्याख्यात्मक है)।

Https://superuser.com/a/363308/131936 से मैंने पाया है कि कैसे फ़ाइल संस्करण का उपयोग करके पढ़ा wmicजा सकता है, जिसे नंगे खिड़कियों के साथ भेज दिया जाता है।

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
)

आप अपने प्रश्न के संबंध में इसका उपयोग कैसे करें:

सबसे पहले, एक फ़ाइल संस्करण पढ़ें:

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

यदि आप चाहें, तो आप संस्करण को हार्डकोड भी कर सकते हैं:

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

PS यहां समान सिद्धांत पर निर्मित विंडोज़ संस्करण को पढ़ने / जांचने की मेरी स्क्रिप्ट है


1

संस्करण की जाँच के लिए बिल्कुल नहीं, लेकिन आप दो फाइलों के MD5 या SHA1 चेकसम की गणना और तुलना कर सकते हैं और यदि वे समान हैं तो तुलना करें। यदि चेकसम स्ट्रिंग्स समान हैं, तो दो फाइलें बिल्कुल समान हैं (इसलिए एक ही संस्करण), अलग-अलग।

चेकसम की गणना करने के लिए आप कमांड लाइन में FCIV टूल का उपयोग कर सकते हैं


1
मुझे विश्वास नहीं है कि ओपी के बाद क्या है ... मुझे लगता है कि वे फ़ाइल संस्करण के बाद हैं, जैसा कि विंडोज़
कनाडाई ल्यूक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.