如何获取和评估可执行文件的版本以确定是否应安装更新?

问题描述 投票:0回答:1

我正在编写一个自动下载软件的脚本。该软件在最新版本的 VMware Workstation 上运行。现在版本是16.1.0.

我希望在根本没有安装

vmware.exe
或版本不至少为
vmware.exe
时安装
16.1.0.683
版本 16。

我找到了一些选择,但似乎都不适合我。

到目前为止我所拥有的不起作用的代码:

if exist "C:\Program Files (x86)\VMware\VMware Workstation\vmware.exe VER 16.1.0.683" (
    echo Version installed
) else (
    echo Installation takes some minutes. Don't interrupt!
    %~dp0\..\downloads\VMware-workstation-full-16.1.0-17198959.exe /s /v /qn EULAS_AGREED=1 AUTOSOFTWAREUPDATE=0 DATACOLLECTION=0
)

它始终运行

else
语句中的命令。

有什么想法吗?

batch-file version vmware
1个回答
0
投票

我建议使用此批处理文件来执行 VMware Workstation 安装和更新任务:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "AppFileName=vmware.exe"
set "AppMinVersion=16.1.0.683"
set "AppName=VMware Workstation"

for /F "skip=1 tokens=2*" %%I in ('%SystemRoot%\System32\reg.exe QUERY "HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\%AppFileName%" /ve 2^>nul') do if "%%I" == "REG_SZ" (
    if not exist "%%J" (
        echo %AppName% is registered to be installed in the folder:
        echo(
        echo "%%~dpJ"
        echo(
        echo But the file %AppFileName% does not exist.
        echo(
        echo Installing %AppName% ...
        echo(
        goto InstallVMware
    )
    set "AppFullName=%%J"
    goto GetVersion
)
echo %AppName% is not installed and registered. Installing it ...
echo(
goto InstallVMware

:GetVersion
set "EscapedFileName=%AppFullName:\=\\%"
set "EscapedFileName=%EscapedFileName:'=\'%"
for /F "usebackq delims=" %%I in (`%SystemRoot%\System32\wbem\wmic.exe DataFile where "Name='%EscapedFileName%'" GET Version /VALUE 2^>nul`) do for /F "tokens=1* delims==" %%J in ("%%I") do set "VersionVMware=%%K" & goto CheckVersion
echo ERROR: Failed to determine version of installed %AppName% executable:
echo(
echo        "%AppFullName%"
echo(
echo Please report this error to ... for a manual investigation.
echo(
echo There is done nothing regarding to %AppName% installation.
pause
goto EndBatch

:CheckVersion
for /F "tokens=1-4 delims=." %%G in ("%VersionVMware%") do set "VersionMajor=%%G" & set "VersionMinor=%%H" & set "VersionPatch=%%I" & set "VersionBuild=%%J"
for /F "tokens=1-4 delims=." %%G in ("%AppMinVersion%") do set "MinVersionMajor=%%G" & set "MinVersionMinor=%%H" & set "MinVersionPatch=%%I" & set "MinVersionBuild=%%J"
rem For the following version number comparisons is expexted that the version
rem string does not contain numbers with leading zeros like 08 or 009 or 014
rem as such numbers would be interpreted as octal numbers by command IF.
if %VersionMajor% LSS %MinVersionMajor% goto UpdateVMware
if %VersionMajor% GTR %MinVersionMajor% goto NoInstall
if %VersionMinor% LSS %MinVersionMinor% goto UpdateVMware
if %VersionMinor% GTR %MinVersionMinor% goto NoInstall
if %VersionPatch% LSS %MinVersionPatch% goto UpdateVMware
if %VersionPatch% GTR %MinVersionPatch% goto NoInstall
if %VersionBuild% LSS %MinVersionBuild% goto UpdateVMware

:NoInstall
echo %AppName% is already installed in version %VersionVMware%.
goto EndBatch

:UpdateVMware
echo %AppName% is installed in version %VersionVMware%.
echo An update is necessary, installing it ...
echo(

:InstallVMware
echo The installation of %AppName% %AppMinVersion% takes some minutes.
echo Please don't interrupt the installation process!
echo(
"%~dp0..\downloads\VMware-workstation-full-16.1.0-17198959.exe" /s /v /qn EULAS_AGREED=1 AUTOSOFTWAREUPDATE=0 DATACOLLECTION=0

:EndBatch
endlocal

批处理文件首先检查 VMware Workstation 的 应用程序注册,以查明它是否已安装以及

vmware.exe
安装在当前计算机上的哪个文件夹中。文件夹
%ProgramFiles(x86)%\VMware\VMware Workstation
只是 VMware Workstation 的默认安装文件夹。可以在手动安装过程中将其安装到任何其他文件夹。

如果

vmware.exe
注册为已安装的应用程序,则批处理文件接下来会检查可执行文件是否确实仍然存在于注册的安装文件夹中。否则安装会损坏,需要重新安装才能解决此问题。

接下来,批处理文件确定

vmware.exe
的版本。如果路径中有一个或多个逗号,这种情况可能会失败,这是非常不寻常的,但并非不可能。在这种情况下,运行批处理文件的用户应将此问题报告给某人以进行手动调查。

已安装的 VMware Workstation 版本按点分开。然后将已安装的VMware Workstation版本与批处理文件应安装的版本进行比较。仅显示已安装的 VMware Workstation 的信息输出已经是预期版本 16.1.0.683 甚至更高版本。

否则,安装将使用您定义的参数启动,以更新现有安装或首次安装 VMware Workstation 或修复损坏的安装。

注意:

%~dp0
引用的批处理文件的路径始终以反斜杠结尾。因此,切勿将
%~dp0
与文件、文件夹或通配符模式连接起来,因为这会导致
\\
出现在最终扩展的参数字符串中,Windows 文件管理必须在将参数字符串传递给之前将其更正回
\
文件系统。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • call /?
    ...解释了如何像使用
    %~dp0
  • 那样引用批处理文件参数
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • reg /?
  • reg query /?
  • set /?
  • setlocal /?
  • wmic /?
  • wmic datafile /?
  • wmic datafile get /?

另请参阅:

阅读有关 使用命令重定向运算符的 Microsoft 文档,了解

2>nul
的说明。重定向运算符
>
必须在
FOR
命令行上使用脱字符号 ^ 转义,以便在 Windows 命令解释器在执行命令 FOR 之前处理此命令行时将其解释为文字字符,该命令在后台以
%ComSpec% /c
1 开头更多命令进程并将命令行作为参数字符串传递给该命令进程。

© www.soinside.com 2019 - 2024. All rights reserved.