我有两个可执行文件(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
- 如果
$a
是True
,则将其设置为 1 - 退出并设置
$a
为错误级别 - 测试错误级别为 0 或 1
有关更多 PowerShell 比较运算符,请参阅https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-7.1