コマンドラインから2つの実行可能ファイルのバージョンを比較するにはどうすればよいですか?


13

2つの実行可能ファイル(file1.exeとfile2.exe)があります。

両方とも「同じ」ファイルですが、一方は他方よりもベンダーの新しいバージョンです。いずれかのプロパティを開くと、[詳細]タブで次のように表示されます。

ここに画像の説明を入力してください

バッチでは、2つのファイルバージョンを比較し、バージョンが異なる場合(「この場合、その場合」のシナリオの種類)に何かをしたいと思います。

高い値と低い値を検索しましたが、「ファイルバージョン」属性をバッチで表示する方法が見つかりません。これを達成する方法はありますか?

これは「スクリプトを書いてください」という質問を意図したものではないことに注意してください。その目的は、回答のより一般的な概要または説明を目的としたものであり、その時点で、詳細ははるかに簡単にわかるはずです。

回答:


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 Service Pack 2サポートツールまたは

Windows Server 2003 Service Pack 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"));

python、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);
?>

Perl:

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
@ランダム それは何を改善しようとします。ご意見ありがとうございます。大きな変更を加えようと思います。
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
)

あなたの質問に関してこれを使用する方法:

最初に、1つのファイルバージョンを読み取ります。

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これは同様の原理に基づいて構築された、Windowsバージョンを読み取り/チェックするためのスクリプトです。


1

バージョンチェック用ではありませんが、2つのファイルのMD5またはSHA1チェックサムを計算して比較し、それらが同じかどうかを比較できます。チェックサム文字列が等しい場合、2つのファイルはまったく同じです(したがって同じバージョンです)。

コマンドラインでFCIVツール使用して、チェックサムを計算できます。


1
私はそれがOPの後にあるとは思わない... Windowsによって報告されているように、彼らはファイルバージョンの後だと思う
カナダのLuke
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.