명령 행에서 두 실행 파일의 버전을 어떻게 비교할 수 있습니까?


13

두 개의 실행 파일 (file1.exe 및 file2.exe)이 있습니다.

둘 다 "같은"파일이지만 하나는 다른 것보다 공급 업체의 최신 버전입니다. 그중 하나의 속성을 열면 세부 정보 탭에서 다음을 얻습니다.

여기에 이미지 설명을 입력하십시오

일괄 적으로 두 파일 버전을 비교하고 버전이 다른 경우 ( "이 경우에는 해당"시나리오 유형) 무언가를 수행하고 싶습니다.

높고 낮게 검색했지만 "파일 버전"속성을 일괄 적으로 보는 방법을 찾지 못하는 것 같습니다. 이를 달성 할 수단이 있습니까?

이것은 "나를위한 스크립트 작성"질문이 아닙니다. 의도는 답변에 대한보다 일반적인 개요 또는 설명을위한 것이며,이 시점에서 세부 사항을 훨씬 쉽게 얻을 수 있어야합니다.

답변:


27

Sigcheck - Sysinternals 스위트

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"

filever-지원 도구 :

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 :

pefile modyle 설치 : 압축 해제, 실행 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);
?>

펄 :

Win32 :: File :: 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
@random Alas. 그것은 무엇을 개선하려고 시도합니다. 귀하의 의견에 감사드립니다, 나는 큰 변화를 시도합니다.
STTR

2

@STTR의 대답은 예를 들어 10.0.10049와 6.3.9600을 비교할 때 문제가 될 수 있기 때문에 배치 에서 버전을 비교 하는 방법을 제공하지 않는 한 예외입니다.

평범하게 IF %ver1% GTR %ver%해주면 얻을 수 있습니다. 문자열 비교 가 이루어지고 6.3.9600보다 크게 나타납니다 10.0.10049.

나는 당신이 "나를 위해 쓰기"가 아니라고 말했지만, 일반 영어로 설명하는 것보다 코드를 작성하는 것이 더 쉬운 경우입니다 (코드는 설명이 필요합니다).

에서 /superuser//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)

추신 : 여기 에 비슷한 원칙에 따라 Windows 버전을 읽고 확인하는 스크립트가 있습니다.


1

버전 확인은 아니지만 두 파일의 MD5 또는 SHA1 체크섬을 계산 및 비교 한 다음 동일한 지 비교할 수 있습니다. 체크섬 문자열이 같으면 두 파일이 정확히 동일하므로 버전이 동일합니다.

명령 행에서 FCIV 도구사용하여 체크섬을 계산할 수 있습니다 .


1
나는 그것이 OP가 무엇인지를 믿지 않는다 ... Windows에 의해보고 된 것처럼 파일 버전 이후라고 생각합니다.
Canadian Luke
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.