信号检查-Sysinternals 套件

信号检查-Sysinternals 套件

我有两个可执行文件(file1.exe 和 file2.exe)。

两者都是“相同”的文件,但其中一个是供应商提供的较新版本。当我打开其中一个的属性时,我在“详细信息”选项卡下看到以下内容:

在此处输入图片描述

在批处理中,我想比较两个文件版本,如果版本不同则执行某些操作(“如果这样,那么那样”类型的场景)。

我找遍了所有地方,但似乎找不到批量查看“文件版本”属性的方法。有什么方法可以实现这个吗?

请注意,这并不是一个“帮我写一个脚本”的问题。我们的目的是对答案进行更一般性的概述或描述,这样,细节应该能够更容易地得到。

答案1

信号检查-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

变量 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

工作场所安全与健康:

cscript //Nologo vers01.vbs

版本01.vbs:

WScript.Echo CreateObject("Scripting.FileSystemObject").GetFileVersion(CreateObject("WScript.Shell").Environment("Process")("WINDIR") & "\system32\mstsc.exe")

JScript:

cscript //Nologo vers01.js

版本01.js:

WScript.Echo(new ActiveXObject("Scripting.FileSystemObject").GetFileVersion(new ActiveXObject("WScript.Shell").ExpandEnvironmentStrings("%windir%")+"//system32//mstsc.exe"));

Python,佩菲莱

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的:

php vers01.php

php.ini(%windir%):

extension_dir = C:\php\ext\

[COM_DOT_NET]
extension=php_com_dotnet.dll

版本01.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";}

答案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,它随裸窗口一起提供。

比较版本.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 https://superuser.com/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这里我的脚本用于读取/检查 Windows 版本,建立在类似的原理之上。

答案3

不完全用于版本检查,但您可以计算并比较两个文件的 MD5 或 SHA1 校验和,然后比较它们是否相同。如果校验和字符串相等,则两个文件完全相同(因此版本相同),否则不同。

你可以使用 FCIV 工具在命令行中计算校验和。

答案4

没有简单的方法可以使用 Windows 命令(批处理)比较具有多个小数的版本号。PowerShell 确实有一种方法可以使用 来执行此操作[System.Version]

set ver1=4.5.6.7
set ver2=1.2.3.4
PowerShell $a=[System.Version]"$env:ver1" -gt [System.Version]"$env:ver2"; ^
if ($a) {Set-Variable -Name "a" -Value "1"}; ^
exit $a

if %errorlevel% == 0 echo ver1 is greater than ver2
if %errorlevel% == 1 echo ver1 is less than than ver2

工作原理:

  • 使用 Windows 命令设置两个变量,ver1然后ver2
  • 启动 Powershell 并使用; ^来结束多行
  • 致电[System.Version]比较版本
  • 我们定义的变量作为$env:变量传递给 PowerShell
  • 如果ver1大于“ver2”,则将$a设置为True
  • 如果$aTrue,则将其设置为 1
  • 退出并设置$a为错误级别
  • 测试错误级别为 0 或 1

有关更多 PowerShell 比较运算符,请参阅https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-7.1

相关内容