我正在写一个可以自动下载软件的脚本。该软件可在最新版本的VMware工作站上运行。现在是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语句中运行命令。
有什么想法吗?
发布于 2021-04-15 15:32:43
我建议使用此批处理文件执行VMware工作站安装和更新任务:
@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工作站的application registration,以确定它是否已安装,以及vmware.exe安装在当前计算机上的哪个文件夹中。文件夹%ProgramFiles(x86)%\VMware\VMware Workstation只是VMware工作站的默认安装文件夹。在手动安装过程中,它可以安装到任何其他文件夹。
如果vmware.exe已注册为已安装的应用程序,则批处理文件接下来会检查可执行文件是否确实存在于已注册的安装文件夹中。否则,安装会损坏,因此必须重新安装才能解决此问题。
接下来,批处理文件确定vmware.exe的版本。如果路径中有一个或多个逗号,这可能会失败,这是非常不寻常的,但也不是不可能。在这种情况下,运行批处理文件的用户应该向某人报告此问题,以便进行手动调查。
已安装的VMware工作站的版本以点分隔。然后将已安装的VMware工作站版本与应随批处理文件一起安装的版本进行比较。在已安装的VMware工作站上只有一条信息输出,它已经是预期的版本16.1.0.683或更高版本。
否则,将使用您定义的参数启动安装,以更新现有安装、首次安装VMware工作站或修复损坏的安装。
注意:使用%~dp0引用的批处理文件的路径始终以反斜杠结尾。出于这个原因,切勿将带有额外反冲的%~dp0与文件、文件夹或通配符模式连接在一起,因为这会导致\\最终扩展参数字符串,在将参数字符串传递到文件系统之前,Windows文件管理必须将其更正回\。
要了解使用的命令及其工作原理,请打开一个command prompt窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /? ...说明如何像引用%~dp0echo /?endlocal /?for /?goto /?if /?reg /?reg query /?set /?setlocal /?wmic /?wmic datafile /?wmic datafile get /?一样引用批处理文件参数
另请参阅:
解释运算符&的
有关2>nul的说明,请阅读有关Using command redirection operators的微软文档。重定向操作符>必须使用上的插入字符^进行转义,以便在命令解释程序处理此命令行时将其解释为文字字符,然后执行的命令,该命令将在后台以%ComSpec% /c的另一个命令进程启动,并将命令行作为参数字符串传递给此命令进程。
https://stackoverflow.com/questions/67071869
复制相似问题