Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何获取和评估可执行文件的版本,以确定是否应安装更新?_Batch File_Version_Vmware - Fatal编程技术网

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

Batch file 如何获取和评估可执行文件的版本,以确定是否应安装更新?,batch-file,version,vmware,Batch File,Version,Vmware,我正在编写一个自动下载软件的脚本。该软件在最新版本的VMware Workstation上运行。现在是16.1.0版 我希望在根本没有安装vmware.exe或版本至少不是16.1.0.683时安装vmware.exe版本16 我找到了一些选择,但似乎没有一个适合我 到目前为止,我拥有的不起作用的代码: if exist "C:\Program Files (x86)\VMware\VMware Workstation\vmware.exe VER 16.1.0.683" (

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

我希望在根本没有安装
vmware.exe
或版本至少不是
16.1.0.683
时安装
vmware.exe
版本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
语句中运行命令


有什么想法吗?

我建议将此批处理文件用于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的版本在dots上分开。然后将已安装的VMware Workstation的版本与应随批处理文件一起安装的版本进行比较。已安装的VMware Workstation上只有一个信息输出,它已经是预期的版本16.1.0.683,甚至是更新的版本

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

注意:
%~dp0
引用的批处理文件的路径始终以反斜杠结束。因此,千万不要将
%~dp0
与文件、文件夹或通配符模式连接起来,因为这样会导致
\\
最终扩展参数字符串,Windows文件管理必须在将参数字符串传递到文件系统之前将其更正回
\

要了解所使用的命令及其工作方式,请打开一个窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • 呼叫/?
    。。。解释如何使用
    %~dp0
  • echo/?
  • endlocal/?
  • 获取/?
  • goto/?
  • 如果/?
  • reg/?
  • reg query/?
  • 设置/?
  • setlocal/?
  • wmic/?
  • wmic数据文件/?
  • wmic数据文件获取/?
另见:

  • 解释操作员
    &

阅读有关的Microsoft文档,以了解有关nul的说明。当Windows命令解释器处理此命令行时,重定向运算符
必须在上用插入符号
^
转义,以便在执行
%ComSpec%/c
的命令之前将命令行解释为文字字符处理并将命令行作为参数字符串传递到此命令进程。

您的系统上没有名为
vmware.exe VER 16.1.0.683
的文件,这就是它总是失败的原因。您的文件名为
vmware.exe
。这个网站上有很多问题需要确定可执行文件的版本,你使用过搜索工具吗?
IF
命令的帮助文件非常清楚它的用途。EXIST filename指定指定文件名存在时的真实条件。您在哪里找到了尝试在该命令中使用版本号的示例?